跳至主要內容

部署Node节点

Zenghr大约 3 分钟kubernetes

部署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 BootStrapapi-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