K8s二进制部署单节点 master组件 node组件 ——头悬梁
K8s二进制部署单节点 master组件 node组件 ——头悬梁
1、master组件部署
2、node 组件部署
k8s集群搭建:
- etcd集群
- flannel网络插件
- 搭建master组件
- 搭建node组件
1、master组件部署:
创建工作目录
生成证书
准备k8s软件包
生成bootstrap token 认证文件
启动 apiserver
启动controller-manager、scheduler
验证master组件状态
1 ##### 在 master01 节点上操作 ##### 2 //上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包 3 cd /opt/k8s/ 4 unzip master.zip 5 apiserver.sh 6 scheduler.sh 7 controller-manager.sh 8 9 chmod +x *.sh 10 11 //创建kubernetes工作目录 12 mkdir -p /opt/kubernetes/{cfg,bin,ssl} 13 14 //创建用于生成CA证书、相关组件的证书和私钥的目录 15 mkdir /opt/k8s/k8s-cert 16 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert 17 cd /opt/k8s/k8s-cert/ 18 ./k8s-cert.sh #生成CA证书、相关组件的证书和私钥 19 20 ls *pem 21 admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem 22 admin.pem apiserver.pem ca.pem kube-proxy.pem 23 //controller-manager 和 kube-scheduler 设置为只调用当前机器的 apiserver,使用 127.0.0.1:8080 通信,因此不需要签发证书 24 25 //复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中 26 cp ca*pem apiserver*pem /opt/kubernetes/ssl/ 27 28 //上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包 29 cd /opt/k8s/ 30 tar zxvf kubernetes-server-linux-amd64.tar.gz 31 32 //复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中 33 cd /opt/k8s/kubernetes/server/bin 34 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/ 35 ln -s /opt/kubernetes/bin/* /usr/local/bin/ 36 37 //创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权 38 cd /opt/k8s/ 39 vim token.sh 40 #!/bin/bash 41 #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格 42 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') 43 #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成 44 cat > /opt/kubernetes/cfg/token.csv <<EOF 45 ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap" 46 EOF 47 48 chmod +x token.sh 49 ./token.sh 50 51 cat /opt/kubernetes/cfg/token.csv 52 53 //二进制文件、token、证书都准备好后,开启 apiserver 服务 54 cd /opt/k8s/ 55 56 57 //检查进程是否启动成功 58 ps aux | grep kube-apiserver 59 60 //k8s通过kube-apiserver这个进程提供服务,该进程运行在单个master节点上。默认有两个端口6443和8080 61 //安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证 62 netstat -natp | grep 6443 63 64 //本地端口8080用于接收HTTP请求,非认证或授权的HTTP请求通过该端口访问API Server 65 netstat -natp | grep 8080 66 67 //查看版本信息(必须保证apiserver启动正常,不然无法查询到server的版本信息) 68 kubectl version 69 70 71 //启动 scheduler 服务 72 cd /opt/k8s/ 73 ./scheduler.sh 127.0.0.1 74 75 ps aux | grep kube-scheduler 76 77 78 //启动 controller-manager 服务 79 cd /opt/k8s/ 80 ./controller-manager.sh 127.0.0.1 81 82 83 //查看 master 节点状态 84 kubectl get componentstatuses #也可以 kubectl get cs 85 NAME STATUS MESSAGE ERROR 86 controller-manager Healthy ok 87 scheduler Healthy ok 88 etcd-2 Healthy {"health":"true"} 89 etcd-1 Healthy {"health":"true"} 90 etcd-0 Healthy {"health":"true"}
2、node组件部署:
node搭建流程
- 准备 kubelet kube-proxy 启动,停止等操作,用于管理kubelei和kube-proxy进程
- 在master节点上准备kubelet和kube-proxy加入k8s群集所要使用的kubeconfig文件,并传给node节点
- kubeconfig文件包含了加入k8s集群需要的ca证书,tls证书和私钥,bootstrap的token信息,master的apisever IP+端口(6443)
- node节点启动kubelet,node节点的kublet会向master的apiserver发起CSR认证请求
- 在Master节点上通过CSR认证,node会自动生成证书,以后的node的kubelet访问都会通过这个证书做认证
- node节点上加载ipvs模块,再启动kube-proxy
1 ##### 在 master01 节点上操作 ##### 2 //把 kubelet、kube-proxy 拷贝到 node 节点 3 cd /opt/k8s/kubernetes/server/bin 4 scp kubelet kube-proxy root@192.168.208.20:/opt/kubernetes/bin/ 5 scp kubelet kube-proxy root@192.168.208.30:/opt/kubernetes/bin/ 6 7 8 ##### 在 node01 节点上操作 ##### 9 //上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh 10 cd /opt/ 11 unzip node.zip 12 13 14 ##### 在 master01 节点上操作 ##### 15 //创建用于生成kubelet的配置文件的目录 16 mkdir /opt/k8s/kubeconfig 17 18 //上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中 19 #kubeconfig.sh 文件包含集群参数(CA 证书、API Server 地址),客户端参数(上面生成的证书和私钥),集群 context 上下文参数(集群名称、用户名)。Kubenetes 组件(如 kubelet、kube-proxy)通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群,连接到 apiserver。 20 cd /opt/k8s/kubeconfig 21 chmod +x kubeconfig.sh 22 23 //生成kubelet的配置文件 24 cd /opt/k8s/kubeconfig 25 ./kubeconfig.sh 192.168.80.10 /opt/k8s/k8s-cert/ 26 27 ls 28 bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfig 29 30 //把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点 31 cd /opt/k8s/kubeconfig 32 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.208.20:/opt/kubernetes/cfg/ 33 scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.208.30:/opt/kubernetes/cfg/ 34 35 //RBAC授权,将预设用户 kubelet-bootstrap 与内置的 ClusterRole system:node-bootstrapper 绑定到一起,使其能够发起 CSR 请求 36 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap 37 38 ------------------------------------------------------------------------------------------ 39 kubelet 采用 TLS Bootstrapping 机制,自动完成到 kube-apiserver 的注册,在 node 节点量较大或者后期自动扩容时非常有用。 40 Master apiserver 启用 TLS 认证后,node 节点 kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与 apiserver 通信,当 node 节点很多时,签署证书是一件很繁琐的事情。因此 Kubernetes 引入了 TLS bootstraping 机制来自动颁发客户端证书,kubelet 会以一个低权限用户自动向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署。 41 42 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 认证请求。 43 44 TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的;kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。 45 46 也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。 47 ------------------------------------------------------------------------------------------ 48 49 //查看角色: 50 kubectl get clusterroles | grep system:node-bootstrapper 51 52 //查看已授权的角色: 53 kubectl get clusterrolebinding 54 55 56 ##### 在 node01 节点上操作 ##### 57 //使用kubelet.sh脚本启动kubelet服务 58 cd /opt/ 59 chmod +x kubelet.sh 60 ./kubelet.sh 192.168.80.11 61 62 //检查kubelet服务启动 63 ps aux | grep kubelet 64 65 //此时还没有生成证书 66 ls /opt/kubernetes/ssl/ 67 68 69 ##### 在 master01 节点上操作 ##### 70 //检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书 71 kubectl get csr 72 NAME AGE REQUESTOR CONDITION 73 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 2m kubelet-bootstrap Pending 74 75 //通过 CSR 请求 76 kubectl certificate approve node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 77 78 //再次查看 CSR 请求状态,Approved,Issued 表示已授权 CSR 请求并签发证书 79 kubectl get csr 80 NAME AGE REQUESTOR CONDITION 81 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 4m kubelet-bootstrap Approved,Issued 82 83 //查看群集节点状态,成功加入node01节点 84 kubectl get nodes 85 NAME STATUS ROLES AGE VERSION 86 192.168.80.11 Ready 87 88 89 ##### 在 node01 节点上操作 ##### 90 //自动生成了证书和 kubelet.kubeconfig 文件 91 ls /opt/kubernetes/cfg/kubelet.kubeconfig 92 ls /opt/kubernetes/ssl/ 93 94 //加载 ip_vs 模块 95 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 96 97 //使用proxy.sh脚本启动proxy服务 98 cd /opt/ 99 chmod +x proxy.sh 100 ./proxy.sh 192.168.80.11 101 102 systemctl status kube-proxy.service 103 104 ---------- node02 节点部署 ---------- 105 ##方法一: 106 //在 node01 节点上将 kubelet.sh、proxy.sh 文件拷贝到 node02 节点 107 cd /opt/ 108 scp kubelet.sh proxy.sh root@192.168.208.20:/opt/ 109 110 ##### 在 node02 节点上操作 ##### 111 //使用kubelet.sh脚本启动kubelet服务 112 cd /opt/ 113 chmod +x kubelet.sh 114 ./kubelet.sh 192.168.208.30 115 116 ##### 在 master01 节点上操作 ##### 117 //在 master01 节点上操作查看 CSR 请求 118 kubectl get csr 119 NAME AGE REQUESTOR CONDITION 120 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y 15s kubelet-bootstrap Pending 121 122 //通过 CSR 请求 123 kubectl certificate approve node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y124 125 kubectl get csr 126 NAME AGE REQUESTOR CONDITION 127 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y 2m kubelet-bootstrap Approved,Issued 128 129 //查看群集中的节点状态 130 kubectl get nodes 131 NAME STATUS ROLES AGE VERSION 132 192.168.80.11 Ready 133 192.168.80.12 Ready 134 135 //加载 ipvs 模块 136 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 137 138 //使用proxy.sh脚本启动proxy服务 139 cd /opt/ 140 chmod +x proxy.sh 141 ./proxy.sh 192.168.80.12 142 143 systemctl status kube-proxy.service 144 145 ##方法二: 146 //在node01节点操作,把现成的/opt/kubernetes目录和kubelet、kube-proxy的service服务管理文件复制到其他node节点 147 scp -r /opt/kubernetes/ root@192.168.80.12:/opt/ 148 scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.80.12:/usr/lib/systemd/system/ 149 150 //在node02节点上操作,进行修改 151 //首先删除复制过来的证书,等会node02会自行申请证书 152 cd /opt/kubernetes/ssl/ 153 rm -rf * 154 155 //修改配置文件kubelet、kubelet.config、kube-proxy的相关IP地址配置为当前节点的IP地址 156 cd /opt/kubernetes/cfg 157 vim kubelet 158 KUBELET_OPTS="--logtostderr=true \ 159 --v=4 \ 160 --hostname-override=192.168.80.12 \ #修改 161 ...... 162 163 vim kubelet.config 164 kind: KubeletConfiguration 165 apiVersion: kubelet.config.k8s.io/v1beta1 166 address: 192.168.80.12 #修改 167 168 vim kube-proxy 169 KUBE_PROXY_OPTS="--logtostderr=true \ 170 --v=4 \ 171 --hostname-override=192.168.80.12 \ #修改 172 173 //加载 ipvs 模块 174 modprobe ip_vs 175 176 //启动kubelet和kube-proxy服务并设置开机自启 177 systemctl start kubelet.service 178 systemctl enable kubelet.service 179 systemctl start kube-proxy.service 180 systemctl enable kube-proxy.service 181 182 //到master01节点上发现未授权的node02请求,授权node02加入集群 183 kubectl get csr 184 NAME AGE REQUESTOR CONDITION 185 node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks 15s kubelet-bootstrap Pending 186 187 //授权许可加入群集 188 kubectl certificate approve node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks 189 190 kubectl get csr 191 192 kubectl get nodes
部署node2节点
#把node1节点的/opt/kubernetes 目录复制到node2节点中(node1上操作) scp -r /opt/kubernetes/ root@192.168.184.142:/opt #拷贝启动脚本 (node1上操作) scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.184.142:/usr/lib/systemd/system/ #删除所有证书文件 cd /opt/kubernetes/ssl/ rm -rf * #修改kubelet配置文件IP地址 cd ../cfg vim kubelet KUBELET_OPTS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.184.142 \ #修改为node2节点本地地址 --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" #修改kubelet.conf配置文件 vim kubelet.config kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 192.168.184.142 #修改为本地地址 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - 10.0.0.2 #DNS解析地址,需要记下来 clusterDomain: cluster.local. failSwapOn: false authentication: anonymous: enabled: true #修改kube-proxy 配置文件 vim kube-proxy KUBE_PROXY_OPTS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.184.142 \ #修改为本地地址 --cluster-cidr=10.0.0.0/24 \ --proxy-mode=ipvs \ --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig" #启动服务 systemctl start kubelet systemctl enable kubelet systemctl start kube-proxy systemctl enable kube-proxy #master节点授权(master上操作) kubectl get csr kubectl certificate approve 节点2的名称 kubectl get csr #master查看集群状态(master上操作) kubectl get node
自古英雄多磨难