[TOC]
0x00 前言简述 描述: 通过上一篇K8s入门体系架构学习我们初步的了解单节点的master与worker的工作部署流程,但是前面所用的是kuboard所提供的安装脚本作为测试练手安装还是可以将就的,但是在实际的生产的环境中由于业务的复杂性和多样性需要依靠集群来保证其安全可靠性;
安装K8s前我们需要从集群规划的以下几方面入手准备:
(1) 操作系统 (OS) 描述:在使用 CentOS 7x 系的 OS 时建议升级一下内核版本(stable >= 4.19
),不然在运行一些 java 容器的时候可能会遇到一些问题。前期可以在测试环境部署一些 Java 应用业务,观察是否会遇到此类问题,如果遇到此类问题可尝试通过升级内核版本来解决。
Q:Java容器瞬间拉起的过程,整个集群都会被CPU用尽,如何解决Java CPU启动时候CPU资源互争的情况? A:这个问题我们也遇到过,后来把内核升级到4.19后就不再发生了很多内存耗尽,CPU爆炸的问题我们都通过内核升级解决了。
PS : 注意在Linux Kernel 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定 PS : 前面我们说过对于Node工作负载的节点尽可能选择物理机器,而Master节点为了便于恢复建议安装在vSphere虚拟化环境之中;
目前截至本文档汇总时(2020-06-20),Kubernetes 官方还在维护的 release stable 版本有 1.16.x
、 1.17.x
、1.18.x
。1.14.x
和 1.15.x
版本的生命周期都已经接近 EOL
,因此不建议选择较旧版本。综合考虑,目前来讲选择 4 < x < 10
小版本中的 1.17.4
或 1.17.5
版本最为合适以及1.18.3
。
对于 docker-ce
版本,默认使用官方 yum 源中的最新版本即可,即 docker-ce-19.03.9-3.el7
。
对于 harbor
版本,考虑到 harbor v2.0.0-rc1 刚刚 release ,但不建议选择使用,建议选择 v1.9.4 版本,后续如果有遇到问题必须通过升级的方式解决,可以考虑升级到已经 release stable 版本的 v2.x.x
。
pkg
version
release date
kubernetes
v1.17.5
2020-04-16
docker-ce
19.03.9
2020-04-12
harbor
v1.9.4
2020-12-31
在Kubernetes中数据存储一般是通过共享文件的方式,在实际的生产环境中多采用NFS/分布式文件系统GlusterFS或者光纤存储等共享存储方案,为其提供存储空间;
建议采用存储服务器进行提供存储服务,并且在不考虑经费的问题上时固态无疑是最好的选择;
一般来说kubernetes集群在部署安装时候为了防止错误都是将防火墙进行关闭部署的,此时其它硬件或者软件防火墙显得尤为重要,并且交换机一定要划分VLAN做隔离;
0x01 安装部署 描述:我们需要自定义安装所需组件和插件所以我们下面进行利用 kubeadm
进行手动部署K8S(单机|集群
);
0.基础安装环境 描述:在进行kubeadm安装的时候,不论是worker节点或者master节点都需要进行执行; 系统环境建议:
系统版本
[TOC]
0x00 前言简述 描述: 通过上一篇K8s入门体系架构学习我们初步的了解单节点的master与worker的工作部署流程,但是前面所用的是kuboard所提供的安装脚本作为测试练手安装还是可以将就的,但是在实际的生产的环境中由于业务的复杂性和多样性需要依靠集群来保证其安全可靠性;
安装K8s前我们需要从集群规划的以下几方面入手准备:
(1) 操作系统 (OS) 描述:在使用 CentOS 7x 系的 OS 时建议升级一下内核版本(stable >= 4.19
),不然在运行一些 java 容器的时候可能会遇到一些问题。前期可以在测试环境部署一些 Java 应用业务,观察是否会遇到此类问题,如果遇到此类问题可尝试通过升级内核版本来解决。
Q:Java容器瞬间拉起的过程,整个集群都会被CPU用尽,如何解决Java CPU启动时候CPU资源互争的情况? A:这个问题我们也遇到过,后来把内核升级到4.19后就不再发生了很多内存耗尽,CPU爆炸的问题我们都通过内核升级解决了。
PS : 注意在Linux Kernel 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定 PS : 前面我们说过对于Node工作负载的节点尽可能选择物理机器,而Master节点为了便于恢复建议安装在vSphere虚拟化环境之中;
目前截至本文档汇总时(2020-06-20),Kubernetes 官方还在维护的 release stable 版本有 1.16.x
、 1.17.x
、1.18.x
。1.14.x
和 1.15.x
版本的生命周期都已经接近 EOL
,因此不建议选择较旧版本。综合考虑,目前来讲选择 4 < x < 10
小版本中的 1.17.4
或 1.17.5
版本最为合适以及1.18.3
。
对于 docker-ce
版本,默认使用官方 yum 源中的最新版本即可,即 docker-ce-19.03.9-3.el7
。
对于 harbor
版本,考虑到 harbor v2.0.0-rc1 刚刚 release ,但不建议选择使用,建议选择 v1.9.4 版本,后续如果有遇到问题必须通过升级的方式解决,可以考虑升级到已经 release stable 版本的 v2.x.x
。
pkg
version
release date
kubernetes
v1.17.5
2020-04-16
docker-ce
19.03.9
2020-04-12
harbor
v1.9.4
2020-12-31
在Kubernetes中数据存储一般是通过共享文件的方式,在实际的生产环境中多采用NFS/分布式文件系统GlusterFS或者光纤存储等共享存储方案,为其提供存储空间;
建议采用存储服务器进行提供存储服务,并且在不考虑经费的问题上时固态无疑是最好的选择;
一般来说kubernetes集群在部署安装时候为了防止错误都是将防火墙进行关闭部署的,此时其它硬件或者软件防火墙显得尤为重要,并且交换机一定要划分VLAN做隔离;
0x01 安装部署 描述:我们需要自定义安装所需组件和插件所以我们下面进行利用 kubeadm
进行手动部署K8S(单机|集群
);
0.基础安装环境 描述:在进行kubeadm安装的时候,不论是worker节点或者master节点都需要进行执行; 系统环境建议:
系统版本 1 2 3 4 5 6 CentOS 7.x/8.x (推荐此处环境7.8),Ubuntu(18.04) OS KERNER >= 4.18
环境检查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 hostnamectl set -hostname master-01 hostnamectl status swapoff -a setenforce 0 yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config echo "127.0.0.1 $(hostname) " >> /etc/hostscat <<EOF >> /etc/hosts 10.80.172.211 master-01 EOF systemctl stop firewalld systemctl disable firewalld
系统内核参数调整: 1 2 3 4 5 6 7 8 9 10 11 12 egrep -q "^(#)?net.ipv4.ip_forward.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g" /etc/sysctl.conf || echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.forwarding.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf sysctl -p
1.Docker 安装配置 描述:主要就是下载指定的Docker-ce版本以及docker-compose的下载配置,注意在 master 节点和 worker 节点都要执行
;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 export REGISTRY_MIRROR=yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine yum install -y yum-utils lvm2 wget yum install -y nfs-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum list docker-ce --showduplicates | sort -r read -p '请输入需要安装的Docker-ce的版本号(例如:19.03.9):' VERSIONyum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose chmod +x /usr/local /bin/docker-compose mkdir /etc/docker/ cat > /etc/docker/daemon.json <<EOF {"registry-mirrors" : ["REPLACE" ]} EOF sed -i "s#REPLACE#${REGISTRY_MIRROR} #g" /etc/docker/daemon.json systemctl enable docker systemctl start docker docker-compose -v docker info
2.K8s 基础环境 描述:以下是对于K8s基础环境的安装以及分别实现Master和Node节点初始化;
k8s 环境安装设置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 export K8SVERSION="1.18.3" yum remove -y kubelet kubeadm kubectl cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum list kubeadm --showduplicates|sort -r yum install -y kubeadm-${K8SVERSION} kubectl-${K8SVERSION} kubelet-${K8SVERSION} sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl restart docker systemctl enable kubelet && systemctl start kubelet
3.master - 主控制节点配置 描述:关于初始化时用到的环境变量
APISERVER_NAME 不能是 master 的 hostname
APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 export K8SVERSION="1.18.3" export MASTER_IP=${IPADDR} export APISERVER_NAME=apiserver.testexport REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.comexport POD_SUBNET=10.100.0.1/16echo "${MASTER_IP} ${APISERVER_NAME} " >> /etc/hostsif [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m" echo 当前POD_SUBNET=$POD_SUBNET echo 当前APISERVER_NAME=$APISERVER_NAME exit 1 fi rm -f ./kubeadm-config.yaml cat <<EOF > ./kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v${K8SVERSION} imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers controlPlaneEndpoint: "${APISERVER_NAME} :6443" networking: serviceSubnet: "10.99.0.0/16" podSubnet: "${POD_SUBNET} " dnsDomain: "cluster.local" EOF kubeadm init --config=kubeadm-config.yaml --upload-certs rm -rf /root/.kube/ mkdir /root/.kube/ cp -i /etc/kubernetes/admin.conf /root/.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config echo -e "---安装calico-3.13.1---" rm -f calico-3.13.1.yaml wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml kubectl apply -f calico-3.13.1.yaml watch kubectl get pod -n kube-system -o wide echo -e "---等待容器组构建完成---" && sleep 180kubectl get nodes -o wide
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME /.kube sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \ --discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951 \ --control-plane --certificate-key 28b178f04afae3770aa92add0206650b2359dd61424f127a6d44142dd15a280d kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \ --discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951
weiyigeek.top-
4.node - 工作节点配置 注意,该段命令只在Worker节点执行。1 2 3 4 5 read -p "请输入K8s的Master节点的IP地址:" MASTER_IPecho "${MASTER_IP} ${APISERVER_NAME} " >> /etc/hostsecho -e "\e[32m#只在 master 节点执行以下命令\n kubeadm token create --print-join-command\n可获取kubeadm join 命令及参数在Node节点运行即可\n" echo -e "[注意]:该 token 的有效时间为 24 个小时,24小时内,您可以使用此 token 初始化任意数量的 worker 节点\e[0m"
如下命令按照其注释的机器或者节点上执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [root@ks8test ~] W0616 15:10:45.622701 23160 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] kubeadm join apiserver.test:6443 --token 5q3zl5.4h2xllxhy7gxccx1 --discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951 [root@node-1 ~] 请输入K8s的Master节点的IP地址:10.10.107.193 kubeadm token create --print -join-command 可获取kubeadm join 命令及参数在Node节点运行即可 [注意]:该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点 [root@node-1 ~] [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml' [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster. [root@ks8test ~] NAME STATUS ROLES AGE VERSION ks8test Ready master 22h v1.18.3 node-1 Ready <none> 67s v1.18.3
0x02 手动安装K8s集群(在线) 描述:安装K8s高可用集群至少需要三个Master节点和不限制节点数量的工作节点进行组成,否则会出现脑裂
的现象;
三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡
多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡
weiyigeek.top-集群架构
集群安装环境说明以及IP地址规划说明:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 CentOS Linux release 7.8.2003 (Core) 5.7.0-1.el7.elrepo.x86_64 docker 19.03.9 docker-compose 1.25.5 Kubernetes 1.18.4 mirrorgcrio/kube-proxy:v1.18.4 mirrorgcrio/kube-apiserver:v1.18.4 mirrorgcrio/kube-controller-manager:v1.18.4 mirrorgcrio/kube-scheduler:v1.18.4 calico/node:v3.13.1 calico/pod2daemon-flexvol:v3.13.1 calico/cni:v3.13.1 calico/kube-controllers:v3.13.1 mirrorgcrio/pause:3.2 mirrorgcrio/coredns:1.6.7 mirrorgcrio/etcd:3.4.3-0
IP地址规划
IP
主机名称
备注
10.10.107.191
master-01
主Master节点
10.10.107.192
master-02
从Master节点
10.10.107.193
master-03
从Master节点
10.10.107.194
worker-01
工作节点
10.10.107.196
worker-02
工作节点
ApiServer 的 Load Balancer(私网)相关: 监听连接端口:6443 / TCP 后端资源组:包含 master-01,master-02,master-03; 实现 Load Balancer 方式:nginx / haproxy / keepalived / 云供应商提供的负载均衡产品
,这里我们暂时不涉及;
特别注意:
1.任意节点建议大于等于centos 版本为 7.6 或 7.7;
2.任意节点 CPU 内核数量大于等于 2,且内存大于等于 4G;
3.任意节点 hostname 不是 localhost,且不包含下划线、小数点、大写字母并且不能重复;
4.任意节点都有固定的内网 IP 地址且为单网卡
5.任意节点上 Kubelet使用的 IP 地址 可互通无需 NAT 映射即可相互访问),且没有防火墙、安全组隔离Selinux;
6.任意节点上临时的swap分区将被关闭;
7.任意节点上初始化时用到的环境变量APISERVER_NAME是一致的,不能是 master 的 hostname并且必须全为小写字母、数字、小数点,不能包含减号;
8.任意节点上初始化时用到的环境变量 POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠(常常是一个A类私有地址-CIDR 值)。
9.任意的master节点在进行初始化的时候,如果中间出现部署步骤的配置出错,需要重新初始化 master 节点
时请先执行 kubeadm reset
操作
操作流程:
1.全部主机都需要执行以下脚本进行基础环境配置与(docker/docker-compose/kubernetes)安装
所以需要对其进行自定义的修改配置(主要是:节点主机名称/APISERVER/APIPORT
);
基础环境:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 export HOSTNAME=worker-02swapoff -a && setenforce 0 yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config hostnamectl set -hostname $HOSTNAME hostnamectl status echo "127.0.0.1 $HOSTNAME " >> /etc/hostscat >> /etc/hosts <<EOF 10.10.107.191 master-01 10.10.107.192 master-02 10.10.107.193 master-03 10.10.107.194 worker-01 10.10.107.196 worker-02 EOF echo "source <(kubectl completion bash)" >> ~/.bashrcecho -e "nameserver 223.6.6.6\nnameserver 192.168.10.254" >> /etc/resolv.confsystemctl stop firewalld && systemctl disable firewalld yum install -y yum-utils lvm2 wget yum install -y nfs-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum list docker-ce --showduplicates | sort -r read -p '请输入需要安装的Docker-ce的版本号(例如:19.03.9):' VERSIONyum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose chmod +x /usr/local /bin/docker-compose if [[ ! -d "/etc/docker/" ]];then mkdir /etc/docker/;fi cat > /etc/docker/daemon.json <<EOF {"registry-mirrors" : ["REPLACE" ]} EOF sed -i "s#REPLACE#${REGISTRY_MIRROR} #g" /etc/docker/daemon.json systemctl enable docker && systemctl start docker docker-compose -v && docker info egrep -q "^(#)?net.ipv4.ip_forward.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g" /etc/sysctl.conf || echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.forwarding.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf sysctl -p cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum list kubelet --showduplicates | tail -n 10 yum install -y kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4 sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl enable kubelet systemctl restart docker && systemctl restart kubelet
2.仅在主Master节点(10.10.107.191
)上进行Master节点初始化操作(该节点也是接入集群使用的ip
);1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 APISERVER_IP=10.10.107.191 APISERVER_NAME=k8s.weiyigeek.top APISERVER_PORT=6443 SERVICE_SUBNET=10.99.0.0/16 POD_SUBNET=10.100.0.1/16 echo "${APISERVER_IP} ${APISERVER_NAME} " >> /etc/hostsrm -f ./kubeadm-config.yaml cat <<EOF > ./kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v${K8SVERSION} imageRepository: mirrorgcrio controlPlaneEndpoint: "${APISERVER_NAME} :${APISERVER_PORT} " networking: serviceSubnet: "${SERVICE_SUBNET} " podSubnet: "${POD_SUBNET} " dnsDomain: "cluster.local" EOF kubeadm init --config=kubeadm-config.yaml --upload-certs mkdir -p $HOME /.kube sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config rm -f calico-3.13.1.yaml wget -L https://kuboard.cn/install-script/calico/calico-3.13.1.yaml kubectl apply -f calico-3.13.1.yaml
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 watch kubectl get pod -n kube-system -o wide kubectl get node -o wide docker images kubectl apply -f calico-3.13.1.yaml
注意:请等到所有容器组(大约9个)全部处于 Running 状态,才进行下一步
3.在其余两台从Master节点上运行第二条命令便会加入到master集群之中,但是执行下面(1) (2)
前我们需要将使用到的镜像进行下载;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 kubeadm config images pull --image-repository mirrorgcrio kubeadm config images list --image-repository mirrorgcrio > gcr.io.log sed -e "s#\\(/.*$\\)#\1 k8s.gcr.io\1#g" gcr.io.log > gcr.io.log1 while read k8sgcrio;do docker tag ${k8sgcrio} done < gcr.io.log1while read k8s;do docker rmi ${k8s} done < gcr.io.log$docker imagesAPISERVER_IP=10.10.107.191 APISERVER_NAME=k8s.weiyigeek.top echo "${APISERVER_IP} ${APISERVER_NAME} " >> /etc/hostskubeadm join k8s.weiyigeek.top:6443 --token opcpye.79zeofy6eo4h9ag6 \ --discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243 \ --control-plane --certificate-key 6dbee003011ac1dae15ae1fad3014ac8b568d154387aa0c43663d5fc47a109c4 mkdir -p $HOME /.kube sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config
weiyigeek.top-从Master节点
5.验证master集群是否部署正常1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 kubectl get nodes -o wide kubectl get pods -A -o wide [root@master-01 ~]$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-1 Healthy {"health" :"true" } etcd-2 Healthy {"health" :"true" } etcd-0 Healthy {"health" :"true" } [root@master-02 ~]$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-2 Healthy {"health" :"true" } etcd-0 Healthy {"health" :"true" } etcd-1 Healthy {"health" :"true" } [root@master-03 ~]$ kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-2 Healthy {"health" :"true" } etcd-1 Healthy {"health" :"true" } etcd-0 Healthy {"health" :"true" } kubectl get cm kubeadm-config -n kube-system -o yaml kubectl get ep kube-controller-manager -n kube-system -o yaml
weiyigeek.top-选举查看
注意事项:
1) 只有在Master节点才能执行查看node以及pod相关信息;
2) 如果主Master节点在初始化时候出错需要重新配置时候请执行以下命令进行重置;1 2 3 4 5 6 7 8 9 10 systemctl stop kubelet docker stop $(docker ps -aq) docker rm -f $(docker ps -aq) systemctl stop docker kubeadm reset sudo rm -rf $HOME /.kube /etc/kubernetes sudo rm -rf /var/lib/cni/ /etc/cni/ /var/lib/kubelet/* iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X systemctl start docker systemctl start kubelet
3) 如果加入主master节点时一直停留在 pre-flight 状态,请在第二、三个节点上执行命令检查:curl -ik https://设置APISERVER:6443/version
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $curl -ik https://k8s.weiyigeek.top:6443/versionHTTP/1.1 200 OK Cache-Control: no-cache, private Content-Type: application/json Date: Wed, 24 Jun 2020 02:16:23 GMT Content-Length: 263 { "major" : "1" , "minor" : "18" , "gitVersion" : "v1.18.4" , "gitCommit" : "c96aede7b5205121079932896c4ad89bb93260af" , "gitTreeState" : "clean" , "buildDate" : "2020-06-17T11:33:59Z" , "goVersion" : "go1.13.9" , "compiler" : "gc" , "platform" : "linux/amd64" }
0x03 手动安装K8s集群(离线) 描述:离线安装K8s即在机器没有连接外网的情况进行进行K8S集群的安装; 安装方式两种:
1.离线安装工具sealos
1 2 3 4 5 6 7 纯golang开发,只需一个二进制,无任何依赖 内核本地负载,不依赖haproxy keepalived等 不依赖ansible 99年证书 支持自定义配置安装 工具与资源包分离,离线安装,安装不同版本仅需要更换不同资源包即可 支持ingress kuboard prometheus等APP(addons)安装
2.自建一个系统模板的软件仓库以及docker镜像仓库harbor;
基础要求:
1.系统推荐CentOS7.6以上,内核推荐4.14以上,CPU节点配置不低于2核4G;
2.有机器 root 用户密码一致(如不一致也可以使用 ssh 密钥)
1.半自动离线安装 描述:对于半自动离线进行kubernetes的安装,我们采用离线下载镜像以及搭建本地内部yum仓库服务器,我们需要进行一下的准备工作;
(1) 基础操作系统安装镜像: CentOS Linux release 7.8.2003 (Core) - 5.7.0-1.el7.elrepo.x86_64
(2) 内网yum仓库建立下载Kubernetes相关的安装包即:kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4
(3) Docker相关环境下载kubernetes相关功能组件进行打包(后面建议采用harbor镜像仓库):1 2 3 4 5 6 7 k8s.gcr.io/kube-apiserver:v1.18.4 k8s.gcr.io/kube-controller-manager:v1.18.4 k8s.gcr.io/kube-scheduler:v1.18.4 k8s.gcr.io/kube-proxy:v1.18.4 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.7
(4) 简易的web应用:Nginx或者httpd环境
(5) 准备几台相关配置的机器并且设置不同的机器名称;
k8s.gcr.io镜像下载方法:
1.机器不能访问k8s.gcr.io
情况下1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 K8SVERSION=1.18.5 kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io/docker pull mirrorgcrio/g' | sudo sh kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io\(.*\)/docker tag mirrorgcrio\1 k8s.gcr.io\1/g' | sudo sh kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io/docker image rm mirrorgcrio/g' | sudo sh docker save -o v${K8SVERSION} .tar $(docker images | grep -v TAG | cut -d ' ' -f1) gzip v${K8SVERSION} .tar v${K8SVERSION} .tar.gz
2.机器能访问k8s.gcr.io时建议,将所需版本的镜像 pull 下来然后 save 成 tar 包传回本地或者harbor之中。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash set -xueapt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update for version in 1.17.4do apt install kubeadm=${version} -00 mkdir -p ${version} kubeadm config images pull --kubernetes-version=${version} docker save -o v${version} .tar $(docker images | grep -v TAG | grep k8s.gcr.io | cut -d ' ' -f1) gzip v${version} .tar v${version} .tar.gz done
基础流程: Step1.本地内部yum仓库搭建(相关环境的依赖包下载)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 export K8SVERSION="1.18.5" export REGISTRY_MIRROR="https://xlx9erfu.mirror.aliyuncs.com" hostnamectl set -hostname k8s-yum-server && echo "127.0.0.1 k8s-yum-server" >> /etc/hosts setenforce 0 && getenforce && hostnamectl status sed -i "s#keepcache=0#keepcache=1#g" /etc/yum.conf && echo -e "缓存目录:" && grep "cachedir" /etc/yum.conf if [[ ! -d "/etc/docker/" ]];then mkdir /etc/docker/;fi cat > /etc/docker/daemon.json <<EOF {"registry-mirrors" : ["REPLACE" ]} EOF sed -i "s#REPLACE#${REGISTRY_MIRROR} #g" /etc/docker/daemon.json systemctl daemon-reload systemctl restart docker kubelet yum install -y yum-utils lvm2 wget nfs-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum list docker-ce --showduplicates | sort -r read -p '请输入需要安装的Docker-ce的版本号(例如:19.03.9):' VERSIONyum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io yum list kubeadm --showduplicates | sort -r yum install -y kubelet-${K8SVERSION} kubeadm-${K8SVERSION} kubectl-${K8SVERSION} httpd createrepo
Step2.下载K8s.gcr.io中的镜像到本地并且进行打包1 2 3 4 5 6 7 kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io/docker pull mirrorgcrio/g' | sudo sh kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io\(.*\)/docker tag mirrorgcrio\1 k8s.gcr.io\1/g' | sudo sh kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null | sed 's/k8s.gcr.io/docker image rm mirrorgcrio/g' | sudo sh docker save -o v${K8SVERSION} .tar $(docker images | grep -v TAG | cut -d ' ' -f1) gzip v${K8SVERSION} .tar v${K8SVERSION} .tar.gz
Step3.将yum缓存下载的rpm以及k8s打包后的镜像放在httpd应用服务访问目录里即/var/www/html/
,然后进行生成内部yum数据库和信息索引文件;1 2 3 4 5 6 7 8 9 mv /etc/httpd/conf.d/welcome.conf{,.bak} mkdir /var/www/html/yum/ find /var/cache/yum -name *.rpm -exec cp -a {} /var/www/html/yum/ \; cp v${K8SVERSION} .tar.gz /var/www/html/yum/ && chmod +644 /var/www/html/yum/v${K8SVERSION} .tar.gz createrepo -pdo /var/www/html/yum/ /var/www/html/yum/ createrepo --update /var/www/html/yum/
Step4.内部yum仓库的httpd服务启动和防火墙设置1 2 3 firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload systemctl start httpd
Step5.利用模板克隆一台机器出来验证内部仓库是否配置成功可以正常进行软件安装1 2 3 4 5 6 7 8 9 echo "10.10.107.201 yum.weiyigeek.top" >> /etc/hostscat > /etc/yum.repos.d/localyumserver.repo <<END [localyumserver] name=localyumserver baseurl=http://yum.weiyigeek.top/yum/ enabled=1 gpgcheck=0 END yum --enablerepo=localyumserver --disablerepo=base,extras,updates,epel,elrepo,docker-ce-stable list
如果正常显示以下则说明创建成功,否则请参考报错信息进行相应的调整;
weiyigeek.top-localyumserver
Step6.在这台克隆机上进行安装K8s基础环境的设置1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 export HOSTNAME=worker-03swapoff -a && setenforce 0 yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab sed -i "s/^SELINUX=.*$/SELINUX=disabled/" /etc/selinux/config hostnamectl set -hostname $HOSTNAME hostnamectl status echo "127.0.0.1 $HOSTNAME " >> /etc/hostscat >> /etc/hosts <<EOF 10.10.107.191 master-01 10.10.107.192 master-02 10.10.107.193 master-03 10.10.107.194 worker-01 10.10.107.196 worker-02 10.20.172.200 worker-03 EOF egrep -q "^(#)?net.ipv4.ip_forward.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g" /etc/sysctl.conf || echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf egrep -q "^(#)?net.ipv6.conf.all.forwarding.*" /etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g" /etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf sysctl -p export REGISTRY_MIRROR="https://xlx9erfu.mirror.aliyuncs.com" if [[ ! -d "/etc/docker/" ]];then mkdir /etc/docker/;fi cat > /etc/docker/daemon.json <<EOF {"registry-mirrors" : ["REPLACE" ]} EOF sed -i "s#REPLACE#${REGISTRY_MIRROR} #g" /etc/docker/daemon.json
Step7.利用内部yum源进行Kuberntes环境安装1 2 3 4 5 6 yum install -y --enablerepo=localyumserver --disablerepo=base,extras,updates,epel,elrepo,docker-ce-stable kubelet kubeadm kubectl sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service systemctl daemon-reload && systemctl enable kubelet systemctl restart docker kubelet
weiyigeek.top-kube相关命令安装常规
Step8.将yum仓库中的镜像拉取本地部署机器上后,再使用 docker load 命令将镜像导入到宿主机 docker 镜像存储中。1 2 wget -c http://10.10.107.201/yum/v1.18.5.tar.gz gzip -dv v1.18.5.tar.gz && docker load < v1.18.5.tar
weiyigeek.top-镜像导入结果
Step9.将工作节点加入到集群之中1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@master-01 ~]$kubeadm token create --print -join-command 2>/dev/null kubeadm join k8s.weiyigeek.top:6443 --token fvu5ei.akiiuhywibwxvdwh --discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243 APISERVER_IP=10.10.107.191 APISERVER_NAME=k8s.weiyigeek.top echo "${APISERVER_IP} ${APISERVER_NAME} " >> /etc/hosts[root@worker-03 ~]$kubeadm join k8s.weiyigeek.top:6443 --token fvu5ei.akiiuhywibwxvdwh --discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243 $kubectl get nodesNAME STATUS ROLES AGE VERSION master-01 Ready master 6d8h v1.18.4 master-02 Ready master 5d20h v1.18.4 master-03 Ready master 5d11h v1.18.4 worker-01 Ready <none> 6d8h v1.18.4 worker-02 Ready <none> 5d21h v1.18.4 worker-03 Ready <none> 11m v1.18.5 $kubectl get pods -A -n kube-system -o wide | grep "worker-03" kube-system calico-node-f2vwk 1/1 Running 0 2m14s 10.20.172.200 worker-03 <none> <none> kube-system kube-proxy-mwml4 1/1 Running 0 2m5s 10.20.172.200 worker-03 <none> <none>
注意事项:
1.当使用 kubeadm pull
相关镜像时 kubeadm
的版本最好和 kubernetes-version=${version}
版本一致,不一致的话有些版本的镜像是 pull 不下来的需要对应版本的 kubernetes 要使用对应版本的镜像才可以。
2.一般来说大版本除了k8s自带的命令版本会有变化外,依赖的功能组件通常是不会变化的比如pause:3.2/etcd:3.4.3-0/coredns:1.6.7
3.成功导入 docker 镜像之后,可以使用 kubeadm init 命令来初始化 master 节点或者初始化work节点;
2.离线包安装(sealos) 描述:对于生产环境需要考虑到控制平面的高可用,在这里为了方便部署选用基于 kubeadm 的部署工具 sealos 安装,包含安装所需的所有二进制文件,镜像文件,systemd配置,yaml配置与一些简单的启动脚本
;对于生产环境无需测试环境当中的一些准备工作,使用 sealos
会自动帮我们完成节点初始化相关工作,只需要在一台 master 节点下载 sealos 二进制文件
和离线安装包部署
即可。
使用资源:
基础说明:
1.对于 1.17.0~1.17.5
或者1.18.0~1.18.5
版本的离线安装包,其中只有 kubenetets 的版本镜像不同其余的插件版本都一致,因此可以选择以 1.17.0/1.18.0
版本为基础制作符合自己所需要的版本。例如:1.18.0基础版本
集群部署:
Step1.下载最新版本的sealos二进制文件1 wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos -O /usr/bin/ && chmod +x /usr/bin/sealos
Step2.sealos参数说明和使用
参数名
含义
示例
是否必须
passwd
服务器密码
123456
和私钥二选一
master
k8s master节点IP地址
192.168.0.2
必须
node
k8s node节点IP地址
192.168.0.3
可选
pkg-url
离线资源包地址,支持下载到本地,或者一个远程地址
/root/kube1.16.0.tar.gz
必须
version
资源包 对应的版本
v1.16.0
必须
kubeadm-config
自定义kubeadm配置文件
kubeadm.yaml.temp
可选
pk
ssh私钥地址,免密钥时使用
/root/.ssh/id_rsa
和passwd二选一
user
ssh用户名
root
可选
interface
机器网卡名,CNI网卡发现用
eth.*
可选
network
CNI类型如calico flannel
calico
可选
podcidr
pod网段
100.64.0.0/10
可选
repo
镜像仓库,离线包通常不用配置,除非你把镜像导入到自己私有仓库了
k8s.gcr.io
可选
svccidr
clusterip网段
10.96.0.0/22
可选
without-cni
不装cni插件,为了用户自己装别的CNI
可选
将制作好的离线安装包 scp
到 master
节点的 /opt
目录下。1 2 3 4 5 6 7 8 9 10 sealos init --master 10.10.107.109 \ --master 10.10.107.119 \ --master 10.10.107.121 \ --node 10.10.107.123 \ --node 10.10.107.124 \ --user root \ --passwd weiyigeek_test \ --version v1.17.4 \ --network calico \ --pkg-url /opt/kube1.17.4.tar.gz
部署成功后会出现以下提示:1 2 3 4 5 6 7 15:37:35 [INFO] [ssh.go:60] [ssh][10.10.107.124:22]: 15:37:35 [INFO] [ssh.go:11] [ssh][10.10.107.124:22]exec cmd is : mkdir -p /etc/kubernetes/manifests 15:37:36 [DEBG] [ssh.go:23] [ssh][10.10.107.124:22]command result is: 15:37:36 [ALRT] [scp.go:156] [ssh][10.10.107.124:22]transfer total size is: 0MB 15:37:36 [INFO] [ssh.go:36] [ssh][10.10.107.124:22]exec cmd is : rm -rf /root/kube 15:37:36 [DEBG] [print.go:20] ==>SendPackage==>KubeadmConfigInstall==>InstallMaster0==>JoinMasters==>JoinNodes 15:37:36 [INFO] [print.go:25] sealos install success.
注意事项:
(1)注意需要修改各个节点的 hostname 不能一致,不然部署的时候会报错duplicate hostnames is not allowed
。