四、部署node节点
4.1 所有node节点部署 docker引擎
#所有 node 节点部署docker引擎 #安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装 docker-ce yum install -y docker-ce #docker-ce-cli、containerd.io会作为依赖包被安装 systemctl start docker.service #启动docker systemctl enable docker.service #设置为开机自启 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4.2 部署 Worker Node 组件
#---------------1、在所有 node 节点上操作----------------- #创建kubernetes工作目录,并创建四个子目录cfg、bin、ssl、logs。cfg用于存放配置文件,bin用于存放执行文件,ssl用于存放证书文件,logs用于存放日志文件 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} #上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod +x kubelet.sh proxy.sh #为两个脚本文件增加执行权限 #--------------2、在 master01 节点上操作---------------- #把 kubelet、kube-proxy 拷贝到两个node 节点 cd /opt/k8s/kubernetes/server/bin scp kubelet kube-proxy root@192.168.41.42:/opt/kubernetes/bin/ scp kubelet kube-proxy root@192.168.41.43:/opt/kubernetes/bin/ #创建/opt/k8s/kubeconfig 目录,上传 kubeconfig.sh 文件到该目录中,生成 kubeconfig 的配置文件。 #kubeconfig文件包含集群参数(CA证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群context上下文参数(集群名称、用户名)。Kubenetes组件(如kubelet、 kube-proxy) 通过启动时指定不同的kubeconfig 文件可以切换到不同的集群,连接到apiserver mkdir /opt/k8s/kubeconfig cd /opt/k8s/kubeconfig chmod +x kubeconfig.sh ./kubeconfig.sh 192.168.41.10 /opt/k8s/k8s-cert/ #运行脚本,生成 kubeconfig 的配置文件。脚本后面跟的参数是 master01的IP、证书目录 #把配置文件bootstrap.kubeconfig、kube-proxy.kubeconfig拷贝到node节点 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.41.42:/opt/kubernetes/cfg/ scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.41.43:/opt/kubernetes/cfg/ #RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap #CSR 请求就是kublet向APIserver请求证书的操作 #若执行失败,可先给kubectl绑定默认cluster-admin管理员集群角色,授权集群操作权限 kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous ----------------------- 虚线内是注释 ------------------------------------------------- kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。 Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。 kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求,这个 Token 被预先内置在 apiserver 节点的 token.csv 中,其身份为 kubelet-bootstrap 用户和 system:kubelet-bootstrap 用户组;想要首次 CSR 请求能成功(即不会被 apiserver 401 拒绝),则需要先创建一个 ClusterRoleBinding,将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定(通过 kubectl get clusterroles 可查询),使其能够发起 CSR 认证请求。 TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的;kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。 也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。 ------------------------------------------------------------------------------------ #---------------3、在所有node节点上操作,启动kubelet服务------------------- #node01节点执行kubelet.sh脚本文件,启动 kubelet 服务,位置参数1为node01的ip地址。 cd /opt/ ./kubelet.sh 192.168.41.42 ps aux | grep kubelet #node02节点执行kubelet.sh脚本文件,启动 kubelet 服务,位置参数1为node02的ip地址。 cd /opt/ ./kubelet.sh 192.168.41.43 ps aux | grep kubelet #-----------------4、在 master01 节点上操作,通过 CSR 请求---------------- #检查到 node01节点和node02节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书 kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw 4m39s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII 13m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending #通过node01节点kubelet的 CSR 请求 kubectl certificate approve node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw #通过node02节点kubelet的 CSR 请求 kubectl certificate approve node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII #Approved,Issued 表示已授权 CSR 请求并签发证书 kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION node-csr-BUxnASfsYjtsTElTC7Dx3PET__fh376QuJYMZrurzSw 23m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued node-csr-vF25KypSyYi4yn2HaHGw-hqvsaJkLR2QkyicsFjJfII 31m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued #查看node节点,由于网络插件还没有部署,节点会没有准备就绪,所以显示NotReady kubectl get node NAME STATUS ROLES AGE VERSION 192.168.41.42 NotReady <none> 11m v1.20.11 192.168.41.43 NotReady <none> 12m v1.20.11 #--------------------5、在所有 node 节点上操作,启动kube-proxy服务----------------------- ##node01节点操作,加载 ip_vs 模块,启动kube-proxy服务 #加载 ip_vs 模块 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done #运行脚本,启动kube-proxy服务 cd /opt/ ./proxy.sh 192.168.41.42 ps aux | grep kube-proxy ##node02节点操作,加载 ip_vs 模块,启动kube-proxy服务 #加载 ip_vs 模块 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done #运行脚本,启动kube-proxy服务 cd /opt/ ./proxy.sh 192.168.41.43 ps aux | grep kube-proxy 复制代码
1、在所有 node 节点上操作
网络异常,图片无法展示
|
2、在 master01 节点上操作
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
3、在所有node节点上操作,启动kubelet服务
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4、在 master01 节点上操作,通过 CSR 请求
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
5、在所有 node 节点上操作
网络异常,图片无法展示
|
网络异常,图片无法展示
|
附录1:kubeconfig.sh
#!/bin/bash #example: kubeconfig.sh 192.168.41.10 /opt/k8s/k8s-cert/ #脚本后面跟的第一个位置参数是:master01的IP,第二个位置参数是:证书目录。 #创建bootstrap.kubeconfig文件 #该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识向 apiserver 发起 CSR 请求 BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv) APISERVER=$1 SSL_DIR=$2 export KUBE_APISERVER="https://$APISERVER:6443" # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig #--embed-certs=true:表示将ca.pem证书写入到生成的bootstrap.kubeconfig文件中 # 设置客户端认证参数,kubelet 使用 bootstrap token 认证 kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig # 使用上下文参数生成 bootstrap.kubeconfig 文件 kubectl config use-context default --kubeconfig=bootstrap.kubeconfig #---------------------- #创建kube-proxy.kubeconfig文件 # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=kube-proxy.kubeconfig # 设置客户端认证参数,kube-proxy 使用 TLS 证书认证 kubectl config set-credentials kube-proxy \ --client-certificate=$SSL_DIR/kube-proxy.pem \ --client-key=$SSL_DIR/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 # 使用上下文参数生成 kube-proxy.kubeconfig 文件 kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig 复制代码
附录2:kubelet.sh
#!/bin/bash NODE_ADDRESS=$1 DNS_SERVER_IP=${2:-"10.0.0.2"} #创建 kubelet 启动参数配置文件 cat >/opt/kubernetes/cfg/kubelet <<EOF KUBELET_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/opt/kubernetes/logs \ --hostname-override=${NODE_ADDRESS} \ --network-plugin=cni \ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \ --config=/opt/kubernetes/cfg/kubelet.config \ --cert-dir=/opt/kubernetes/ssl \ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0" EOF #--hostname-override:指定kubelet节点在集群中显示的主机名或IP地址,默认使用主机hostname;kube-proxy和kubelet的此项参数设置必须完全一致 #--network-plugin:启用CNI #--kubeconfig:指定kubelet.kubeconfig文件位置,当前为空路径,会自动生成,用于如何连接到apiserver,里面含有kubelet证书,master授权完成后会在node节点上生成 kubelet.kubeconfig 文件 #--bootstrap-kubeconfig:指定连接 apiserver 的 bootstrap.kubeconfig 文件 #--config:指定kubelet配置文件的路径,启动kubelet时将从此文件加载其配置 #--cert-dir:指定master颁发的kubelet证书生成目录 #--pod-infra-container-image:指定Pod基础容器(Pause容器)的镜像。Pod启动的时候都会启动一个这样的容器,每个pod之间相互通信需要Pause的支持,启动Pause需要Pause基础镜像 #---------------------- #创建kubelet配置文件(该文件实际上就是一个yml文件,语法非常严格,不能出现tab键,冒号后面必须要有空格,每行结尾也不能有空格) cat >/opt/kubernetes/cfg/kubelet.config <<EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: ${NODE_ADDRESS} port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - ${DNS_SERVER_IP} clusterDomain: cluster.local failSwapOn: false authentication: anonymous: enabled: false webhook: cacheTTL: 2m0s enabled: true x509: clientCAFile: /opt/kubernetes/ssl/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 #PS:当命令行参数与此配置文件(kubelet.config)有相同的值时,就会覆盖配置文件中的该值。 #---------------------- #创建 kubelet.service 服务管理文件 cat >/usr/lib/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet After=docker.service Requires=docker.service [Service] EnvironmentFile=/opt/kubernetes/cfg/kubelet ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS Restart=on-failure KillMode=process [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable kubelet systemctl restart kubelet 复制代码