linux怎么查看本机内存大小
304
2022-11-09
第五篇(二进制部署k8s集群---node节点部署)
本文在以下主机上操作部署k8s nodek8s-node1:192.168.206.41k8s-node2:192.168.206.42k8s-node3:192.168.206.43
kubernetes work 节点运行如下组件:dockerkubeletkube-proxyflannel有些组件在前面已经安装了,请看我写的第二篇。
一、安装依赖包
yum install -y epel-release wget conntrack ipvsadm ipset jq iptables curl sysstat libseccomp && /usr/sbin/modprobe ip_vs
二、部署kubelet组件kublet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec、run、logs 等。kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况。为确保安全,本文档只开启接收 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如 apiserver、heapster)。
1、下载和分发kubelet二进制文件
wget https://dl.k8s.io/v1.12.3/kubernetes-server-linux-amd64.tar.gz tar -xzvf kubernetes-server-linux-amd64.tar.gz cp kubernetes/server/bin/ cp kubelet kube-proxy /opt/kubernetes/bin
2、创建kubelet bootstrap kubeconfig文件 (k8s-master1上执行)
export BOOTSTRAP_TOKEN=$(kubeadm token create \ --description kubelet-bootstrap-token \ --groups system:bootstrappers:k8s-master1 \ --kubeconfig ~/.kube/config) # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=/data/ssl/ca.pem \ --embed-certs=true \ --server=\ --kubeconfig=kubelet-bootstrap-k8s-master1.kubeconfig # 设置客户端认证参数 kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=kubelet-bootstrap-k8s-master1.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=kubelet-bootstrap-k8s-master1.kubeconfig # 设置默认上下文 kubectl config use-context default --kubeconfig=kubelet-bootstrap-k8s-master1.kubeconfig kubelet bootstrap kubeconfig文件创建三次,分别把k8s-master1改成k8s-master2、k8s-master3。 证书中写入 Token 而非证书,证书后续由 controller-manager 创建。
3、查看 kubeadm 为各节点创建的 token:
[root@master1 node]# kubeadm token list --kubeconfig ~/.kube/config TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS exo8h6.txwueh8g7mn35h2p 23h 2020-11-19T13:00:56+08:00 authentication,signing kubelet-bootstrap-token system:bootstrappers:k8s-master2 ise3qh.3s3o55giugtd1ije 23h 2020-11-19T13:01:43+08:00 authentication,signing kubelet-bootstrap-token system:bootstrappers:k8s-master3 yianwp.j4ipmbgrugz9hfr7 23h 2020-11-19T12:56:35+08:00 authentication,signing kubelet-bootstrap-token system:bootstrappers:k8s-master1 查看各 token 关联的 Secret [root@k8s-master1 ~]# kubectl get secrets -n kube-system NAME TYPE DATA AGE attachdetach-controller-token-z2w72 kubernetes.io/service-account-token 3 119m bootstrap-signer-token-hz8dr kubernetes.io/service-account-token 3 119m bootstrap-token-8w6j3n bootstrap.kubernetes.io/token 7 20m bootstrap-token-e7n0o5 bootstrap.kubernetes.io/token 7 20m bootstrap-token-ydbwyk bootstrap.kubernetes.io/token 7 93m certificate-controller-token-bjhbq kubernetes.io/service-account-token 3 119m clusterrole-aggregation-controller-token-qkqxg kubernetes.io/service-account-token 3 119m cronjob-controller-token-v7vz5 kubernetes.io/service-account-token 3 119m daemon-set-controller-token-7khdh kubernetes.io/service-account-token 3 119m default-token-nwqsr kubernetes.io/service-account-token 3 119m 4、分发bootstrap kubeconfig文件 scp kubelet-bootstrap-k8s-master1.kubeconfig root@192.168.206.41:/opt/kubernetes/ssl/kubelet-bootstrap.kubeconfig scp kubelet-bootstrap-k8s-master2.kubeconfig root@192.168.206.42:/opt/kubernetes/ssl/kubelet-bootstrap.kubeconfig scp kubelet-bootstrap-k8s-master3.kubeconfig root@192.168.206.43:/opt/kubernetes/ssl/kubelet-bootstrap.kubeconfig
5、创建和分发kubelet参数配置文件(改成对应node主机ip)
cat > kubelet.config.json < 6、创建和分发kubelet systemd unit文件 (改成对应node主机ip) cat /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \
--bootstrap-kubeconfig=/opt/kubernetes/ssl/kubelet-bootstrap.kubeconfig \
--cert-dir=/opt/kubernetes/ssl \
--kubeconfig=/etc/kubernetes/cert/kubelet.kubeconfig \
--config=/opt/kubernetes/ssl/kubelet.config.json \
--hostname-override=192.168.206.41 \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 \
--allow-privileged=true \
--alsologtostderr=true \
--logtostderr=false \
--log-dir=/opt/kubernetes/log \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
如果设置了 --hostname-override 选项,则 kube-proxy 也需要设置该选项,否则会出现找不到 Node 的情况;
--bootstrap-kubeconfig:指向 bootstrap kubeconfig 文件,kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求;
K8S approve kubelet 的 csr 请求后,在 --cert-dir 目录创建证书和私钥文件,然后写入 --kubeconfig 文件;
为各节点创建和分发 kubelet systemd unit 文件: 7、Bootstrap Token Auth和授予权限 kublet 启动时查找配置的 --kubeletconfig 文件是否存在,如果不存在则使用 --bootstrap-kubeconfig 向 kube-apiserver 发送证书签名请求 (CSR)。
kube-apiserver 收到 CSR 请求后,对其中的 Token 进行认证(事先使用 kubeadm 创建的 token),认证通过后将请求的 user 设置为 system:bootstrap:,group 设置为 system:bootstrappers,这一过程称为 Bootstrap Token Auth。
解决办法是:创建一个 clusterrolebinding,将 group system:bootstrappers 和 clusterrole system:node-bootstrapper 绑定:
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers 8、启动kubelet服务 systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet 9、approve kubelet csr请求i、手动approve csr请求 查看 CSR 列表:
[root@k8s-master1 ~]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-P7XcQAc2yNlXn1pUmQFxXNCdGyyt8ccVuW3bmoUZiK4 30m system:bootstrap:e7n0o5 Pending
node-csr-gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM 79m system:bootstrap:ydbwyk Pending
node-csr-u2sVzVkFYnMxPIYWjXHbqRJROtTZBYzA1s2vATPLzyo 30m system:bootstrap:8w6j3n Pending
approve CSR
root@k8s-master1 ~]# kubectl certificate approve node-csr-gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM
certificatesigningrequest.certificates.k8s.io "node-csr gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM" approved
查看 Approve 结果:
[root@k8s-master1 ~]# kubectl describe csr node-csr-gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM
Name: node-csr-gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM
Labels: ii、自动approve csr请求 创建三个 ClusterRoleBinding,分别用于自动 approve client、renew client、renew server 证书:
[root@k8s-master1 ~]# cat > csr-crb.yaml < 10、查看kubelet情况 等待一段时间(1-10 分钟),三个节点的 CSR 都被自动 approve:
[root@k8s-master1 ~]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-P7XcQAc2yNlXn1pUmQFxXNCdGyyt8ccVuW3bmoUZiK4 35m system:bootstrap:e7n0o5 Approved,Issued
node-csr-gD18nmcyPUNWNyDQvCo2BMYiiA4K59BNkclFRWv1SAM 84m system:bootstrap:ydbwyk Approved,Issued
node-csr-u2sVzVkFYnMxPIYWjXHbqRJROtTZBYzA1s2vATPLzyo 35m system:bootstrap:8w6j3n Approved,Issued
所有节点均 ready:
[root@k8s-master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.206.41 Ready 11、Kubelet提供的API接口 kublet 启动后监听多个端口,用于接收 kube-apiserver 或其它组件发送的请求:
[root@k8s-node1 ~]# netstat -lnpt|grep kubelet
tcp 0 0 127.0.0.1:41980 0.0.0.0:* LISTEN 7891/kubelet
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 7891/kubelet
tcp 0 0 192.168.206.41:10250 0.0.0.0:* LISTEN 7891/kubelet
预定义的 ClusterRole system:kubelet-api-admin 授予访问 kubelet 所有 API 的权限:
[root@k8s-master1 ~]# kubectl describe clusterrole system:kubelet-api-admin
Name: system:kubelet-api-admin
Labels: kubernetes.io/bootstrapping=rbac-defaults
Annotations: rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
nodes/log [] [] [*]
nodes/metrics [] [] [*]
nodes/proxy [] [] [*]
nodes/spec [] [] [*]
nodes/stats [] [] [*]
nodes [] [] [get list watch proxy] 12、kubet api认证和授权kublet的配置文件kubelet.config.json配置了如下认证参数: authentication.anonymous.enabled:设置为 false,不允许匿名访问 10250 端口;authentication.x509.clientCAFile:指定签名客户端证书的 CA 证书,开启 HTTPs 证书认证;authentication.webhook.enabled=true:开启 HTTPs bearer token 认证;同时配置了如下授权参数: authroization.mode=Webhook:开启 RBAC 授权;kubelet 收到请求后,使用 clientCAFile 对证书签名进行认证,或者查询 bearer token 是否有效。如果两者都没通过,则拒绝请求,提示 Unauthorized: [root@k8s-node1 ~]# curl -s --cacert /etc/kubernetes/cert/ca.pem https://192.168.206.41:10250/metrics
Unauthorized
[root@k8s-node1 ~]# curl -s --cacert /etc/kubernetes/cert/ca.pem -H "Authorization: Bearer 123456" https://192.168.206.41:10250/metrics
Unauthorized 三、部署kube-proxy组件kube-proxy 运行在所有 worker 节点上,,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。 本文档讲解部署 kube-proxy 的部署,使用 ipvs 模式。1、创建kube-proxy证书 [root@k8s-master1 cert]# cat > kube-proxy-csr.json < 2、创建和分发kubeconfig文件 [root@k8s-master1 cert]#kubectl config set-cluster kubernetes \
--certificate-authority=/data/ssl/ca.pem \
--embed-certs=true \
--server=\
--kubeconfig=kube-proxy.kubeconfig
[root@k8s-master1 cert]#kubectl config set-credentials kube-proxy \
--client-certificate=kube-proxy.pem \
--client-key=kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
[root@k8s-master1 cert]#kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
[root@k8s-master1 cert]#kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
--embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl-proxy.kubeconfig 文件中(不加时,写入的是证书文件路径);
分发kubeconfig文件到node节点 3、创建kube-proxy配置文件 [root@k8s-master1 cert]# cat >kube-proxy.config.yaml < 4、创建和分发kube-proxy systemd unit文件 [root@k8s-node1 cert]# cat /etc/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \
--config=/opt/kubernetes/ssl/kube-proxy.config.yaml \
--alsologtostderr=true \
--logtostderr=false \
--log-dir=/var/lib/kube-proxy/log \
--v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
分发 kube-proxy systemd unit 文件: 5、启动kube-proxy服务 mkdir -p /var/lib/kube-proxy/log
systemctl daemon-reload
systemctl enable kube-proxy
systemctl start kube-proxy
systemctl daemon-reload
systemctl restart kube-proxy 6、检查启动结果 systemctl status kube-proxy|grep Active
确保状态为 active (running),否则查看日志,确认原因:
journalctl -u kube-proxy 7、查看ipvs路由规则 [root@k8s-node1 ssl]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.254.0.1:443 rr
-> 192.168.206.31:6443 Masq 1 0 0
-> 192.168.206.32:6443 Masq 1 0 0
-> 192.168.206.33:6443 Masq 1 0 0
可见将所有到 kubernetes cluster ip 443 端口的请求都转发到 kube-apiserver 的 6443 端口。
恭喜!至此node节点部署完成。 四、验证集群功能1、查看节点状况 [root@k8s-master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.206.41 Ready 2、创建nginx web测试文件 [root@k8s-master1 ~]# cat nginx-web.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-web
labels:
tier: frontend
spec:
type: NodePort
selector:
tier: frontend
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-con
labels:
tier: frontend
spec:
replicas: 3
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: nginx-pod
image: nginx
ports:
- containerPort: 80
执行nginx-web.yaml文件
kubectl create -f nginx-web.yml
查看各个Node上Pod IP的连通性
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-con-594b8d6b48-78pmj 1/1 Running 0 24h 172.30.59.2 192.168.206.43
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~