部署Node节点
大约 3 分钟
部署Node节点
kubernetes master
节点包含的组件:
- kubelet
- kube-proxy
- core-dns
一、创建工作目录并拷贝二进制文件
# 在所有worker node创建工作目录:
mkdir -p /etc/kubernetes/{bin,cfg,logs}
# 从master节点拷贝:
cd kubernetes/server/bin
scp kubelet kube-proxy root@192.168.10.101:/etc/kubernetes/bin
scp kubelet kube-proxy root@192.168.10.103:/etc/kubernetes/bin
# 分发 证书
scp -r /etc/kubernetes/ca root@192.168.10.101:/etc/kubernetes/
scp -r /etc/kubernetes/ca root@192.168.10.103:/etc/kubernetes/
二、部署kubelet
我们这里让kubelet使用引导token的方式认证,所以认证方式跟之前的组件不同,它的证书不是手动生成,而是由工作节点TLS BootStrap
向 api-server
请求,由主节点的controller-manager
自动签发。
2.1 创建kubelet配置文件
# 需要修改 hostname-override
cat > /etc/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/etc/kubernetes/logs \\
--hostname-override=server01 \\
--network-plugin=cni \\
--cni-bin-dir=/opt/cni/bin \\
--kubeconfig=/etc/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/etc/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/etc/kubernetes/cfg/kubelet-config.yml \\
--cert-dir=/etc/kubernetes/ca \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF
字段描述:
--hostname-override
:显示名称,集群中唯一,需要修改成你之前设置主机名,我的是 server01- --network-plugin:启用CNI
- --cni-bin-dir:实际的 CNI 插件可执行文件位置
- --kubeconfig:用于连接apiserver
- --bootstrap-kubeconfig:首次启动向apiserver申请证书
- --config:配置参数文件
- --cert-dir:kubelet证书生成目录
- --pod-infra-container-image:管理Pod网络容器的镜像
2.2 配置参数文件
cat > /etc/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
clusterDomain: cluster.local
failSwapOn: false
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 2m0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/ca/ca.pem
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 5m0s
cacheUnauthorizedTTL: 30s
evictionHard:
imagefs.available: 15%
memory.available: 100Mi
nodefs.available: 10%
nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110
EOF
2.3 生成bootstrap.kubeconfig文件
这个配置是用来完成bootstrap token认证的,保存了像用户,token等重要的认证信息,这个文件可以借助kubectl命令生成:(也可以自己写配置)
# kubectl 命令可以在 master 节点执行,也可以把 kubectl 命令拷贝到 node 节点
scp /usr/local/bin/kubectl root@192.168.10.101:/usr/local/bin
# 指定apiserver的地址和证书位置(ip自行修改)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.10.102:6443 \
--kubeconfig=bootstrap.kubeconfig
# 设置客户端认证参数(注意替换token)
kubectl config set-credentials kubelet-bootstrap \
--token=71dacbf4a541549a2426e3fae9b03a0f \
--kubeconfig=bootstrap.kubeconfig
# 设置上下文
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 设置当前上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
# 移动到配置文件路径
mv bootstrap.kubeconfig /etc/kubernetes/cfg
2.4 systemd管理kubelet
cat > /lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/etc/kubernetes/cfg/kubelet.conf
ExecStart=/etc/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
2.5 启动并设置开机启动
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
# 查看日志是否启动异常
journalctl -f -u kubelet
tail -100f /etc/kubernetes/logs/kubelet.ERROR
2.6 批准kubelet证书申请并加入集群
#--------*在主节点执行*---------
# 查看kubelet证书请求
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-XXXX 6m3s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
# 批准申请
$ kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve
# 查看节点
kubectl get node
NAME STATUS ROLES AGE VERSION
server01 NotReady <none> 2m23s v1.18.6
#-----------------------------
提示
注:由于网络插件还没有部署,节点会没有准备就绪 NotReady
三、部署kube-proxy
3.1 创建kube-proxy配置文件
cat > /etc/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/etc/kubernetes/logs \\
--config=/etc/kubernetes/cfg/kube-proxy-config.yml"
EOF
3.2 配置参数文件
# 注意修改 hostnameOverride 显示名称,集群中唯一
cat > /etc/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
clientConnection:
kubeconfig: /etc/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: 192.168.10.101
clusterCIDR: 10.0.0.0/24
EOF
3.3 生成kube-proxy.kubeconfig文件
# 设置集群参数(注意替换ip)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.10.102:6443 \
--kubeconfig=kube-proxy.kubeconfig
# 客户端认证参数
kubectl config set-credentials kube-proxy \
--client-certificate=/etc/kubernetes/ca/kube-proxy/kube-proxy.pem \
--client-key=/etc/kubernetes/ca/kube-proxy/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
# 选择上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
# 移动到合适位置
mv kube-proxy.kubeconfig /etc/kubernetes/cfg/
3.4 systemd管理kube-proxy
cat > /lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-proxy.conf
ExecStart=/etc/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
3.5 启动并设置开机启动
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy
# 查看日志是否启动异常
journalctl -f -u kube-proxy
tail -100f /etc/kubernetes/logs/kube-proxy.ERROR