Kubernetes高可用集群二进制部署
Kubernetes高可用集群二进制部署(Runtime Containerd)
Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能,努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 它支持一系列容器工具, 包括Docker、Containerd等。
一、集群环境准备
1.1 主机规划
主机IP地址 | 主机名 | 主机配置 | 主机角色 | 软件列表 |
---|---|---|---|---|
192.168.224.12 | k8s-master1 | 2C4G | master | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、Containerd、runc |
192.168.224.13 | k8s-master2 | 2C4G | master | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、Containerd、runc |
192.168.224.14 | k8s-master3 | 2C4G | master | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、Containerd、runc |
192.168.224.15 | k8s-worker1 | 2C4G | worker | kubelet、kube-proxy、Containerd、runc |
192.168.224.10 | ha1 | 1C2G | LB | haproxy、keepalived |
192.168.224.11 | ha2 | 1C2G | LB | haproxy、keepalived |
192.168.224.100 | / | / | VIP(虚拟IP) |
1.2 软件版本
软件名称 | 版本 | 备注 |
---|---|---|
CentOS7 | kernel版本:5.17 | |
kubernetes | v1.21.10 | |
etcd | v3.5.2 | 最新版本 |
calico | v3.19.4 | |
coredns | v1.8.4 | |
containerd | 1.6.1 | |
runc | 1.1.0 | |
haproxy | 5.18 | YUM源默认 |
keepalived | 3.5 | YUM源默认 |
1.3 网络分配
网络名称 | 网段 | 备注 |
---|---|---|
Node网络 | 192.168.224.0/24 | |
Service网络 | 10.96.0.0/16 | |
Pod网络 | 10.244.0.0/16 |
二、集群部署
2.1主机准备
2.1.1 主机名设置
1 | hostnamectl set-hostname xxx |
1 | 关于主机名参见1.1小节主机规划表 |
2.1.2 主机与IP地址解析
1 | cat >> /etc/hosts << EOF |
2.1.3 主机安全设置
2.1.3.1 关闭防火墙
1 | systemctl stop firewalld |
2.1.3.2 关闭selinux
1 | setenforce 0 |
2.1.4 交换分区设置
1 | swapoff -a |
2.1.5 主机系统时间同步
1 | 安装软件 |
2.1.6 主机系统优化
limit优化
1 | ulimit -SHn 65535 |
1 | cat <<EOF >> /etc/security/limits.conf |
2.1.7 ipvs管理工具安装及模块加载
为集群节点安装,负载均衡节点不用安装
1 | yum -y install ipvsadm ipset sysstat conntrack libseccomp |
1 | 所有节点配置ipvs模块,在内核4.19+版本nf_conntrack_ipv4已经改为nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可: |
1 | 创建 /etc/modules-load.d/ipvs.conf 并加入以下内容: |
2.1.8 加载containerd相关内核模块
1 | 临时加载模块 |
1 | 永久性加载模块 |
1 | 设置为开机启动 |
2.1.9 Linux内核升级
在所有节点中安装,需要重新操作系统更换内核。
1 | [root@localhost ~]# yum -y install perl |
1 | [root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
1 | [root@localhost ~]# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm |
1 | [root@localhost ~]# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64 |
1 | [root@localhost ~]# grub2-set-default 0 |
1 | [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg |
2.1.10 Linux内核优化
1 | cat <<EOF > /etc/sysctl.d/k8s.conf |
1 | sysctl --system |
1 | 所有节点配置完内核后,重启服务器,保证重启后内核依旧加载 |
1 | 重启后查看ipvs模块加载情况: |
1 | 重启后查看containerd相关模块加载情况: |
2.1.11 其它工具安装(选装)
1 | yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git lrzsz -y |
2.2 负载均衡器准备
2.2.1 安装haproxy与keepalived
1 | yum -y install haproxy keepalived |
2.2.2 HAProxy配置
1 | cat >/etc/haproxy/haproxy.cfg<<"EOF" |
2.2.3 KeepAlived
主从配置不一致,需要注意。
1 | ha1: |
1 | ha2: |
2.2.4 健康检查脚本
ha1及ha2均要配置
1 | cat > /etc/keepalived/check_apiserver.sh <<"EOF" |
1 | chmod +x /etc/keepalived/check_apiserver.sh |
2.2.5 启动服务并验证
1 | systemctl daemon-reload |
1 | ip address show |
2.3 配置免密登录
在k8s-master1上操作
1 | ssh-keygen |
1 | ssh-copy-id root@k8s-master1 |
1 | ssh root@k8s-master1 |
2.4 部署ETCD集群
部署高可用ETCD数据库集群
在k8s-master1上操作。
2.4.1 创建工作目录
1 | mkdir -p /data/k8s-work |
2.4.2 获取cfssl工具
1 | cd /data/k8s-work |
1 | 说明: |
1 | chmod +x cfssl* |
1 | mv cfssl_linux-amd64 /usr/local/bin/cfssl |
1 | # cfssl version |
2.4.3 创建CA证书
2.4.3.1 配置ca证书请求文件
1 | cat > ca-csr.json <<"EOF" |
2.4.3.2 创建ca证书
1 | cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
2.4.3.3 配置ca证书策略
可以选择这个方式
1 | cfssl print-defaults config > ca-config.json |
或者这个
1 | cat > ca-config.json <<"EOF" |
1 | server auth 表示client可以对使用该ca对server提供的证书进行验证 |
2.4.4 创建etcd证书
2.4.4.1 配置etcd请求文件
1 | cat > etcd-csr.json <<"EOF" |
2.4.4.2 生成etcd证书
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd |
1 | # ls |
2.4.5 部署etcd集群
2.4.5.1 下载etcd软件包
1 | wget https://github.com/etcd-io/etcd/releases/download/v3.5.2/etcd-v3.5.2-linux-amd64.tar.gz |
2.4.5.2 安装etcd软件
1 | tar -xvf etcd-v3.5.2-linux-amd64.tar.gz |
2.4.5.3 分发etcd软件
1 | scp etcd-v3.5.2-linux-amd64/etcd* k8s-master2:/usr/local/bin/ |
2.4.5.4 创建配置文件
1 | mkdir /etc/etcd |
1 | cat > /etc/etcd/etcd.conf <<"EOF" |
1 | 说明: |
2.4.5.5 创建服务配置文件
1 | mkdir -p /etc/etcd/ssl |
1 | cd /data/k8s-work |
1 | cat > /etc/systemd/system/etcd.service <<"EOF" |
2.4.5.6 同步etcd配置到集群其它master节点
1 | 创建目录 |
1 | 服务配置文件,需要修改etcd节点名称及IP地址 |
1 | k8s-master2: |
1 | k8s-master3: |
1 | 证书文件 |
1 | 服务启动配置文件 |
2.4.5.7 启动etcd集群
1 | systemctl daemon-reload |
2.4.5.8 验证集群状态
1 | ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://192.168.224.12:2379,https://192.168.224.13:2379,https://192.168.224.14:2379 endpoint health |
1 | +----------------------------+--------+-------------+-------+ |
1 | 检查ETCD数据库性能 |
1 | 59 / 60 Boooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooom ! 98.33% |
1 | ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://192.168.224.12:2379,https://192.168.224.13:2379,https://192.168.224.14:2379 member list |
1 | +------------------+---------+-------+----------------------------+----------------------------+------------+ |
1 | ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://192.168.224.12:2379,https://192.168.224.13:2379,https://192.168.224.14:2379 endpoint status |
1 | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ |
2.5 Kubernetes集群部署
2.5.1 Kubernetes软件包下载
1 | wget https://dl.k8s.io/v1.21.10/kubernetes-server-linux-amd64.tar.gz |
2.5.2 Kubernetes软件包安装
1 | tar -xvf kubernetes-server-linux-amd64.tar.gz |
2.5.3 Kubernetes软件分发
1 | scp kube-apiserver kube-controller-manager kube-scheduler kubectl k8s-master2:/usr/local/bin/ |
1 | scp kubelet kube-proxy k8s-master1:/usr/local/bin |
2.5.4 在集群节点上创建目录
所有节点
1 | mkdir -p /etc/kubernetes/ |
2.5.5 部署api-server
2.5.5.1 创建apiserver证书请求文件
cd /data/k8s-work
1 | cat > kube-apiserver-csr.json << "EOF" |
1 | 说明: |
2.5.5.2 生成apiserver证书及token文件
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-apiserver-csr.json | cfssljson -bare kube-apiserver |
1 | cat > token.csv << EOF |
1 | 说明: |
2.5.5.3 创建apiserver服务配置文件
1 | cat > /etc/kubernetes/kube-apiserver.conf << "EOF" |
2.5.5.4 创建apiserver服务管理配置文件
1 | cat > /etc/systemd/system/kube-apiserver.service << "EOF" |
2.5.5.5 同步文件到集群master节点
1 | cp ca*.pem /etc/kubernetes/ssl/ |
1 | cp kube-apiserver*.pem /etc/kubernetes/ssl/ |
1 | cp token.csv /etc/kubernetes/ |
1 | scp /etc/kubernetes/token.csv k8s-master2:/etc/kubernetes |
1 | scp /etc/kubernetes/ssl/kube-apiserver*.pem k8s-master2:/etc/kubernetes/ssl |
1 | scp /etc/kubernetes/ssl/ca*.pem k8s-master2:/etc/kubernetes/ssl |
1 | scp /etc/kubernetes/kube-apiserver.conf k8s-master2:/etc/kubernetes/kube-apiserver.conf |
1 | scp /etc/kubernetes/kube-apiserver.conf k8s-master3:/etc/kubernetes/kube-apiserver.conf |
1 | scp /etc/systemd/system/kube-apiserver.service k8s-master2:/etc/systemd/system/kube-apiserver.service |
2.5.5.6 启动apiserver服务
1 | systemctl daemon-reload |
2.5.6 部署kubectl
2.5.6.1 创建kubectl证书请求文件
1 | cat > admin-csr.json << "EOF" |
1 | 说明: |
2.5.6.2 生成证书文件
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin |
2.5.6.3 复制文件到指定目录
1 | cp admin*.pem /etc/kubernetes/ssl/ |
2.5.6.4 生成kubeconfig配置文件
kube.config 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书
1 | kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.224.100:6443 --kubeconfig=kube.config |
2.5.6.5 准备kubectl配置文件并进行角色绑定
1 | mkdir ~/.kube |
2.5.6.6 查看集群状态
1 | export KUBECONFIG=$HOME/.kube/config |
1 | 查看集群信息 |
2.5.6.7 同步kubectl配置文件到集群其它master节点
1 | k8s-master2: |
1 | scp /root/.kube/config k8s-master2:/root/.kube/config |
2.5.6.8 配置kubectl命令补全(可选)
1 | yum install -y bash-completion |
2.5.7 部署kube-controller-manager
2.5.7.1 创建kube-controller-manager证书请求文件
1 | cat > kube-controller-manager-csr.json << "EOF" |
1 | 说明: |
2.5.7.2 创建kube-controller-manager证书文件
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager |
1 | # ls |
2.5.7.3 创建kube-controller-manager的kube-controller-manager.kubeconfig
1 | kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.224.100:6443 --kubeconfig=kube-controller-manager.kubeconfig |
2.5.7.4 创建kube-controller-manager配置文件
1 | cat > kube-controller-manager.conf << "EOF" |
2.5.7.5 创建服务启动文件
1 | cat > kube-controller-manager.service << "EOF" |
2.5.7.6 同步文件到集群master节点
1 | cp kube-controller-manager*.pem /etc/kubernetes/ssl/ |
1 | scp kube-controller-manager*.pem k8s-master2:/etc/kubernetes/ssl/ |
1 | #查看证书 |
2.5.7.7 启动服务
1 | systemctl daemon-reload |
1 | kubectl get componentstatuses |
2.5.8 部署kube-scheduler
2.5.8.1 创建kube-scheduler证书请求文件
1 | cat > kube-scheduler-csr.json << "EOF" |
2.5.8.2 生成kube-scheduler证书
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler |
1 | # ls |
2.5.8.3 创建kube-scheduler的kubeconfig
1 | kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.224.100:6443 --kubeconfig=kube-scheduler.kubeconfig |
2.5.8.4 创建服务配置文件
1 | cat > kube-scheduler.conf << "EOF" |
2.5.8.5创建服务启动配置文件
1 | cat > kube-scheduler.service << "EOF" |
2.5.8.6 同步文件至集群master节点
1 | cp kube-scheduler*.pem /etc/kubernetes/ssl/ |
1 | scp kube-scheduler*.pem k8s-master2:/etc/kubernetes/ssl/ |
2.5.8.7 启动服务
1 | systemctl daemon-reload |
2.5.9 工作节点(worker node)部署
2.5.9.1 Containerd安装及配置
2.5.9.1.1 获取软件包
1 | wget https://github.com/containerd/containerd/releases/download/v1.6.1/cri-containerd-cni-1.6.1-linux-amd64.tar.gz |
2.5.9.1.2 安装containerd
1 | tar -xf cri-containerd-cni-1.6.1-linux-amd64.tar.gz -C / |
1 | 默认解压后会有如下目录: |
2.5.9.1.3 生成配置文件并修改
1 | mkdir /etc/containerd |
1 | containerd config default >/etc/containerd/config.toml |
1 | # ls /etc/containerd/ |
1 | 下面的配置文件中已修改,可不执行,仅修改默认时执行。 |
1 | 下面的配置文件中已修改,可不执行,仅修改默认时执行。 |
1 | # cat >/etc/containerd/config.toml<<EOF |
2.5.9.1.4 安装runc
由于上述软件包中包含的runc对系统依赖过多,所以建议单独下载安装。
默认runc执行时提示:runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond
1 | wget https://github.com/opencontainers/runc/releases/download/v1.1.0/runc.amd64 |
1 | chmod +x runc.amd64 |
1 | 替换掉原软件包中的runc |
1 | # runc -v |
1 | systemctl enable containerd |
2.5.9.2 部署kubelet
在k8s-master1上操作
2.5.9.2.1 创建kubelet-bootstrap.kubeconfig
1 | BOOTSTRAP_TOKEN=$(awk -F "," '{print $1}' /etc/kubernetes/token.csv) |
1 | kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=kubelet-bootstrap |
1 | kubectl describe clusterrolebinding cluster-system-anonymous |
2.5.9.2.2 创建kubelet配置文件
1 | cat > kubelet.json << "EOF" |
2.5.9.2.3 创建kubelet服务启动管理文件
1 | cat > kubelet.service << "EOF" |
2.5.9.2.4 同步文件到集群节点
1 | cp kubelet-bootstrap.kubeconfig /etc/kubernetes/ |
1 | for i in k8s-master2 k8s-master3 k8s-worker1;do scp kubelet-bootstrap.kubeconfig kubelet.json $i:/etc/kubernetes/;done |
1 | 说明: |
2.5.9.2.5 创建目录及启动服务
1 | mkdir -p /var/lib/kubelet |
1 | systemctl daemon-reload |
1 | # kubectl get nodes |
1 | # kubectl get csr |
1 | 说明: |
2.5.9.3 部署kube-proxy
2.5.9.3.1 创建kube-proxy证书请求文件
1 | cat > kube-proxy-csr.json << "EOF" |
2.5.9.3.2 生成证书
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy |
1 | # ls kube-proxy* |
2.5.9.3.3 创建kubeconfig文件
1 | kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://192.168.224.100:6443 --kubeconfig=kube-proxy.kubeconfig |
2.5.9.3.4 创建服务配置文件
1 | cat > kube-proxy.yaml << "EOF" |
2.5.9.3.5 创建服务启动管理文件
1 | cat > kube-proxy.service << "EOF" |
2.5.9.3.6 同步文件到集群工作节点主机
1 | cp kube-proxy*.pem /etc/kubernetes/ssl/ |
1 | for i in k8s-master2 k8s-master3 k8s-worker1;do scp kube-proxy.kubeconfig kube-proxy.yaml $i:/etc/kubernetes/;done |
1 | 说明: |
2.5.9.3.7 服务启动
1 | mkdir -p /var/lib/kube-proxy |
1 | systemctl daemon-reload |
2.5.10 网络组件部署 Calico
2.5.10.1 下载
1 | wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml |
2.5.10.2 修改文件
1 | 3683 - name: CALICO_IPV4POOL_CIDR |
2.5.10.3 应用文件
1 | kubectl apply -f calico.yaml |
2.5.10.4 验证应用结果
1 | # kubectl get pods -A |
1 | # kubectl get nodes |
2.5.10 部署CoreDNS
1 | cat > coredns.yaml << "EOF" |
1 | kubectl apply -f coredns.yaml |
1 | # kubectl get pods -A |
这里可以测试coredns是否生效
1 | dig -t a www.baidu.com @10.96.0.2 |
2.5.11 部署应用验证
1 | cat > nginx.yaml << "EOF" |
1 | kubectl apply -f nginx.yaml |
1 | # kubectl get pods -o wide |
1 | # kubectl get all |
- 本文标题:Kubernetes高可用集群二进制部署
- 本文作者:yichen
- 本文链接:https://yc6.cool/2023/05/17/Kubernetes高可用集群二进制部署/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!