kubernetes二进制集群部署 二——单master集群
内容要点:
一、实验环境
二、单master群集部署
三、多master群集部署
一、实验环境:
基于上篇博客:https://blog.51cto.com/14475876/2470049 部署的环境上
二、单master群集部署
单master群集架构图:
以下是自签SSL证书列表:
1、首先,我们要了解在 Master 上,要部署以下三大核心组件:
kube-apiserver:是集群的统一入口,各组件协调者,所有对象资源的增删改查和监听操作都交给 APIServer 处理后再提交给 Etcd 存储;
kube-controller-manager:处理群集中常规后台任务,一个资源对应一个控制器,而 controller-manager 就是负责管理这些控制器的;
kube-scheduler:根据调度算法为新创建的 Pod 选择一个 Node 节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同节点上。
操作流程:配置文件 -----> systemd 管理组件 -----> 启动
-- 部署开始:
接下来是在 master 上的操作,生成 api-server 证书:
将宿主机上下载好的 master.zip 包上传到 /root/k8s/ 目录下,并解压:[root@localhost k8s]# unzip master.zip[root@localhost k8s]# mkdir /opt/kubernetes/{cfg,bin,ssl} -p [root@localhost k8s]# mkdir k8s-cert //创建 apiserver自签证书的目录[root@localhost k8s]# cd k8s-cert/[root@localhost k8s-cert]# vim k8s-cert.shcat > ca-config.json <ca-csr.json < server-csr.json < admin-csr.json < kube-proxy-csr.json <
2、在 node 节点上的部署:
首先以下是 node 节点上的 三大核心组件:
kubelet:是master在node节点上的agent,可以管理本机运行容器的生命周期,例如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作,kubelet 将每个 Pod转换成一组容器。
kube-proxy:在 node节点上实现 Pod网络代理,维护网络规划和四层负载均衡工作。
docker:容器(我们已经安装好了)
-- 部署开始:
//先在master上,把 kubelet、kube-proxy 拷贝到 node节点上去:[root@localhost ~]# cd k8s/kubernetes/server/bin/[root@localhost bin]# lsapiextensions-apiserver kube-apiserver.docker_tag kube-proxycloud-controller-manager kube-apiserver.tar kube-proxy.docker_tagcloud-controller-manager.docker_tag kube-controller-manager kube-proxy.tarcloud-controller-manager.tar kube-controller-manager.docker_tag kube-schedulerhyperkube kube-controller-manager.tar kube-scheduler.docker_tagkubeadm kubectl kube-scheduler.tarkube-apiserver kubelet mounter[root@localhost bin]# scp kubelet kube-proxy root@192.168.109.131:/opt/kubernetes/bin/[root@localhost bin]# scp kubelet kube-proxy root@192.168.109.132:/opt/kubernetes/bin///在 node01节点上操作(将宿主机上的 node.zip包 到/root 目录下再解压):[root@localhost ~]# lsanaconda-ks.cfg flannel-v0.10.0-linux-amd64.tar.gz node.zip 公共 视频 文档 音乐flannel.sh initial-setup-ks.cfg README.md 模板 图片 下载 桌面[root@localhost ~]# unzip node.zip //解压,获得 kubelet.sh proxy.shArchive: node.zip inflating: proxy.sh inflating: kubelet.sh ----接下来在 master 上操作:[root@localhost k8s]# mkdir kubeconfig[root@localhost k8s]# cd kubeconfig/[root@localhost kubeconfig]# cat /opt/kubernetes/cfg/token.csv //获取 token信息1232eb0133309f6ccde54802cc0b3ebe,kubelet-bootstrap,10001,"system:kubelet-bootstrap"[root@localhost kubeconfig]# vim kubeconfigAPISERVER=$1SSL_DIR=$2# 创建kubelet bootstrapping kubeconfig 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# 设置客户端认证参数kubectl config set-credentials kubelet-bootstrap \ --token=1232eb0133309f6ccde54802cc0b3ebe \ --kubeconfig=bootstrap.kubeconfig# 设置上下文参数kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig# 设置默认上下文 --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.kubeconfigkubectl 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.kubeconfigkubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfigkubectl config use-context default --kubeconfig=kube-proxy.kubeconfig//设置环境变量(可以写入到 /etc/profile 中):[root@localhost kubeconfig]# export PATH=$PATH:/opt/kubernetes/bin///检查健康状态:[root@localhost kubeconfig]# kubectl get csNAME STATUS MESSAGE ERRORscheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} etcd-2 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"} //生成配置文件:[root@localhost kubeconfig]# bash kubeconfig 192.168.109.138 /root/k8s/k8s-cert/[root@localhost kubeconfig]# lsbootstrap.kubeconfig kubeconfig kube-proxy.kubeconfig//拷贝配置文件到 node节点上:[root@localhost kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.109.131:/opt/kubernetes/cfg/[root@localhost kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.109.132:/opt/kubernetes/cfg///创建 bootstrap角色赋予权限用于连接 apiserver请求签名(至关重要):[root@localhost kubeconfig]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap----接下来在 node01 节点上的操作:[root@localhost ~]# bash kubelet.sh 192.168.109.131//检查 kubelet 服务启动:[root@localhost ~]# ps aux|grep kube----在master上://检查到 node01 节点的请求:[root@localhost kubeconfig]# kubectl get csrNAME AGE REQUESTOR CONDITIONnode-csr-M9Iv_3cKuOZaiKSvoQGIarJHOaK1S9FnRs6SGIXP9nk 5s kubelet-bootstrap Pending(意思:等待群集给该节点颁发证书)//接下来同意请求,颁发证书即可:[root@localhost kubeconfig]# kubectl certificate approve node-csr-M9Iv_3cKuOZaiKSvoQGIarJHOaK1S9FnRs6SGIXP9nk[root@localhost kubeconfig]# kubectl get csrNAME AGE REQUESTOR CONDITIONnode-csr-M9Iv_3cKuOZaiKSvoQGIarJHOaK1S9FnRs6SGIXP9nk 7m7s kubelet-bootstrap Approved,Issued(Approved,Issued:就表示已经被允许加入群集)//查看群集节点,成功加入 node01 节点:[root@localhost kubeconfig]# kubectl get nodeNAME STATUS ROLES AGE VERSION192.168.109.131 Ready3m8s v1.12.3----在 node01上操作,启动 proxy服务:[root@localhost ~]# bash proxy.sh 192.168.109.131[root@localhost ~]# systemctl status kube-proxy.service //查看状态是否正常----部署 node02 :为了提高效率,我们将 node01上现成的 /opt/kubernetes目录复制到其他节点进行修改即可:[root@localhost ~]# scp -r /opt/kubernetes/ root@192.168.109.132:/opt///再把kubelet,kube-proxy的service文件拷贝到node2中[root@localhost ~]# scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.109.132:/usr/lib/systemd/system/--接下来就是在 node02 节点上的操作://首先,先删除复制过来的证书,因为待会 node02 会自行申请属于自己的证书:[root@localhost ~]# cd /opt/kubernetes/ssl/[root@localhost ssl]# rm -rf *//修改配置文件 kubelet 、kubelet.config 、kube-proxy(三个配置文件)[root@localhost ssl]# cd /opt/kubernetes/cfg/[root@localhost cfg]# vim kubeletKUBELET_OPTS="--logtostderr=true \--v=4 \--hostname-override=192.168.109.132 \ ##改成自己的IP地址--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"[root@localhost cfg]# vim kubelet.configkind: KubeletConfigurationapiVersion: kubelet.config.k8s.io/v1beta1address: 192.168.109.132 ##改成自己的IP地址port: 10250readOnlyPort: 10255cgroupDriver: cgroupfsclusterDNS:- 10.0.0.2clusterDomain: cluster.local.failSwapOn: falseauthentication: anonymous: enabled: true[root@localhost cfg]# vim kube-proxyKUBE_PROXY_OPTS="--logtostderr=true \--v=4 \--hostname-override=192.168.109.132 \ ##改成自己的IP地址--cluster-cidr=10.0.0.0/24 \--proxy-mode=ipvs \--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"//启动服务:[root@localhost cfg]# systemctl start kubelet.service[root@localhost cfg]# systemctl start kube-proxy.service//和之前一样,在 master 上操作查看请求:[root@localhost kubeconfig]# kubectl get csrNAME AGE REQUESTOR CONDITIONnode-csr-M9Iv_3cKuOZaiKSvoQGIarJHOaK1S9FnRs6SGIXP9nk 29m kubelet-bootstrap Approved,Issuednode-csr-vOfkpLYSYqFtD__GgZZZiV7NU_WaqECDvBbFuGyckRc 2m21s kubelet-bootstrap Pending//接下来和刚刚一样,同意授权,颁发证书即可:[root@localhost kubeconfig]# kubectl certificate approve node-csr-vOfkpLYSYqFtD__GgZZZiV7NU_WaqECDvBbFuGyckRc//查看群集中的节点:[root@localhost kubeconfig]# kubectl get nodeNAME STATUS ROLES AGE VERSION192.168.109.131 Ready 34s v1.12.3192.168.109.132 Ready 25m v1.12.3
!!至此,我们一个单节点的 Master 部署就完成了,接下来是带来 多节点 Master部署
三、多 Master 节点部署:
多 Master节点集群图:
在有单 Master 节点部署环境的基础上,在部署一个 Master02 即可。
角色 IP地址 master02 192.168.109.230
-部署开始:
//首先关闭防火墙:[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0//在 master01上,直接将 kubernetes目录拷贝到 master02上即可:[root@localhost kubeconfig]# scp -r /opt/kubernetes/ root@192.168.109.230:/opt//在复制 master01 上的三个组件启动脚本:kube-apiserver.service、kube-controller-manager.service、kube-scheduler.service [root@localhost kubeconfig]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.220.129:/usr/lib/systemd/system///接下来,在 master02上,修改配置文件 kube-apiserver中的IP地址:[root@localhost cfg]# pwd/opt/kubernetes/cfg[root@localhost cfg]# vim kube-apiserver.(省略部分).--etcd-servers=https://192.168.109.138:2379,https://192.168.109.131:2379,https://192.168.109.132:2379 \--bind-address=192.168.109.230 \ ##改成自己的ip地址--secure-port=6443 \--advertise-address=192.168.109.230 \ ##改成自己的ip地址--allow-privileged=true \--service-cluster-ip-range=10.0.0.0/24 \.(省略部分).//拷贝 master01 上已有的 etcd 证书给 master02 使用:[root@localhost kubeconfig]# scp -r /opt/etcd/ root@192.168.109.230:/opt///接下来,启动 master02中的三个组件:[root@localhost cfg]# systemctl start kube-apiserver.service [root@localhost cfg]# systemctl start kube-controller-manager.service [root@localhost cfg]# systemctl start kube-scheduler.service //增加环境变量:[root@localhost cfg]# vim /etc/profile在末尾添加:export PATH=$PATH:/opt/kubernetes/bin/[root@localhost cfg]# source /etc/profile //环境变量生效//master02 上查看节点情况(和 master01一模一样):[root@localhost cfg]# kubectl get nodeNAME STATUS ROLES AGE VERSION192.168.109.131 Ready44m v1.12.3192.168.109.132 Ready 70m v1.12.3