kubeadm安裝k8s高可用集群實踐
一、環(huán)境規(guī)劃
| 服務器類型 | ip地址 |
| master01 | 192.168.30.100 |
| master02 | 192.168.30.200 |
| master03 | 192.168.30.203 |
| node01 | 192.168.30.14 |
| node02 | 192.168.30.15 |
| hub.dhj.com | 192.168.30.104 |
二、注意事項
master節(jié)點cpu核心數(shù)要求大于2
最新的版本不一定好,但相對于舊版本,核心功能穩(wěn)定,但新增功能、接口相對不穩(wěn)
學會一個版本的 高可用部署,其他版本操作都差不多
宿主機盡量升級到CentOS 7.9
內(nèi)核kernel升級到 4.19+ 這種穩(wěn)定的內(nèi)核
部署k8s版本時,盡量找 1.xx.5 這種大于5的小版本(這種一般是比較穩(wěn)定的版本)
三、環(huán)境準備
1. 關(guān)閉防火墻規(guī)則,關(guān)閉selinux,關(guān)閉swap交換
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab
2. 修改主機名
hostnamectl set-hostname master01 hostnamectl set-hostname master02 hostnamectl set-hostname master03 hostnamectl set-hostname node01 hostnamectl set-hostname node02
3. 所有節(jié)點修改hosts文件
cat >> /etc/hosts << EOF 192.168.30.100 master01 192.168.30.200 master02 192.168.30.203 master03 192.168.30.14 node01 192.168.30.15 node02 EOF
4. 所有節(jié)點時間同步
yum -y install ntpdate ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo 'Asia/Shanghai' >/etc/timezone ntpdate time2.aliyun.com systemctl enable --now crond crontab -e */30 * * * * /usr/sbin/ntpdate time2.aliyun.com
5. 所有節(jié)點實現(xiàn)Linux的資源限制
vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * soft nproc 65535 * hard nproc 655350 * soft memlock unlimited * hard memlock unlimited
6. 所有節(jié)點升級內(nèi)核(可選)
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm cd /opt/ yum localinstall -y kernel-ml* #更改內(nèi)核啟動方式 grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)" grubby --default-kernel reboot
7. 調(diào)整內(nèi)核參數(shù)
cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 fs.may_detach_mounts = 1 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.netfilter.nf_conntrack_max=2310720 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl =15 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_orphans = 327680 net.ipv4.tcp_orphan_retries = 3 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.ip_conntrack_max = 65536 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_timestamps = 0 net.core.somaxconn = 16384 EOF #生效參數(shù) sysctl --system
8. 加載 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
四、所有節(jié)點安裝docker
1. 安裝
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 yum install -y docker-ce docker-ce-cli containerd.io
2. 更改daemon.json配置
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m", "max-file": "3"
}
}
EOF
#將docker的資源限制更改為systemd,保持與k8s一致
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
五、安裝kubeadm,kubelet和kubectl:
所有節(jié)點安裝kubeadm,kubelet和kubectl
1. 定義kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
2. 配置Kubelet使用阿里云的pause鏡像
cat > /etc/sysconfig/kubelet <<EOF KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2" EOF
3. 開機自啟kubelet
systemctl enable --now kubelet
六、高可用組件安裝、配置
1. 所有 master 節(jié)點部署 Haproxy
yum -y install haproxy
2. 配置haproxy代理
cat > /etc/haproxy/haproxy.cfg << EOF
global
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option redispatch
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind *:16443 #如果與apiserver部署在同一臺機器上監(jiān)聽端口會沖突,更改監(jiān)聽端口
mode tcp
option tcplog
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
server k8s-master1 192.168.30.100:6443 check inter 10000 fall 2 rise 2 weight 1
server k8s-master2 192.168.30.200:6443 check inter 10000 fall 2 rise 2 weight 1
server k8s-master3 192.168.30.203:6443 check inter 10000 fall 2 rise 2 weight 1
EOF
3. 所有 master 節(jié)點部署 keepalived
yum -y install keepalived
4. 配置keepalived 高可用
cd /etc/keepalived/
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_HA1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.30.10 #設置VIP地址
}
track_script {
chk_haproxy
}
}
5. 編寫健康檢測腳本
vim check_haproxy.sh
#!/bin/bash
if ! killall -0 haproxy; then
systemctl stop keepalived
fi
chmod +x check_haproxy.sh6. 啟動高可用代理集群
systemctl enable --now haproxy systemctl enable --now keepalived
七、部署K8S集群
1. 在 master01 節(jié)點上設置集群初始化配置文件
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.30.100 #指定當前master節(jié)點的IP地址
13 bindPort: 6443
21 apiServer:
22 certSANs: #在apiServer屬性下面添加一個certsSANs的列表,添加所有master節(jié)點的IP地址和集群VIP地址
23 - 192.168.30.10
24 - 192.168.30.100
25 - 192.168.30.200
26 - 192.168.30.203
30 clusterName: kubernetes
31 controlPlaneEndpoint: "192.168.30.10:16444" #指定集群VIP地址
32 controllerManager: {}
38 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #指定鏡像下載地址
39 kind: ClusterConfiguration
40 kubernetesVersion: v1.20.15 #指定kubernetes版本號
41 networking:
42 dnsDomain: cluster.local
43 podSubnet: "10.244.0.0/16" #指定pod網(wǎng)段,10.244.0.0/16用于匹配flannel默認網(wǎng)段
44 serviceSubnet: 10.96.0.0/16 #指定service網(wǎng)段
45 scheduler: {}
#末尾再添加以下內(nèi)容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默認的kube-proxy調(diào)度方式改為ipvs模式
2. 更新集群初始化配置文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
3. 所有節(jié)點拉取鏡像
#拷貝yaml配置文件給其他主機,通過配置文件進行拉取鏡像 for i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done kubeadm config images pull --config /opt/new.yaml
4. master01 節(jié)點進行初始化
kubeadm init --config new.yaml --upload-certs | tee kubeadm-init.log
初始化后會出現(xiàn)以下信息用來加入k8s集群:
#提示:
.........
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
#這個命令是常規(guī)用戶身份運行,在master01節(jié)點執(zhí)行此命令
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
#如果是root用戶,在master01節(jié)點執(zhí)行此命令,兩種都行,自己選
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
#master節(jié)點加入使用的命令,記錄!
kubeadm join 192.168.88.200:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
--control-plane --certificate-key 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
#node節(jié)點加入使用的命令。記錄!
kubeadm join 192.168.88.200:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98
5. 修改controller-manager和scheduler配置文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
......
#- --port=0 #搜索port=0,把這一行注釋掉
systemctl restart kubelet
所有master節(jié)點配置
6. 部署網(wǎng)絡插件flannel
所有節(jié)點上傳 flannel 鏡像 flannel.tar 和網(wǎng)絡插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目錄,master節(jié)點上傳 kube-flannel.yml 文件 cd /opt docker load < flannel.tar mv /opt/cni /opt/cni_bak mkdir -p /opt/cni/bin tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin #注意自己使用的版本 kubectl apply -f kube-flannel.yml
7. 所有節(jié)點加入集群
7.1 所有master 節(jié)點加入集群
使用自己的token
kubeadm join 192.168.30.10:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
--control-plane --certificate-key 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
7.2 node 節(jié)點加入集群
kubeadm join 192.168.30.10:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98
8. 查看集群信息
#在 master01 查看集群信息 kubectl get nodes kubectl get pod -A
八、安裝Harbor私有倉庫
新開一臺服務器,ip地址為:192.168.30.104
1. 安裝docker
//修改主機名
hostnamectl set-hostname hub.dhj.com
//所有節(jié)點加上主機名映射
echo '192.168.30.104 hub.dhj.com' >> /etc/hosts
//安裝 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
yum install -y docker-ce docker-ce-cli containerd.io
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.dhj.com"]
}
EOF
systemctl start docker
systemctl enable docker
2. 所有 node 節(jié)點都修改配置文件,加上私有倉庫配置
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.dhj.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
3. 安裝Harbor
cd /opt/ #上傳 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目錄 cp docker-compose /usr/local/bin chmod +x /usr/local/bin/docker-compose #將docker-compose編排工具復制到bin目錄,并添加執(zhí)行權(quán)限 tar -zxvf harbor-offline0installer-v1.2.2.tgz #將harbor包解包 cd harbor.cfg vim harbor.cfg 5 hostname = hub.dhj.com 9 ui_url_protocol = https 24 ssl_cert = /data/cert/server.crt 25 ssl_cert_key = /data/cert/server.key 59 harbor_admin_password = Harbor12345
4.生成證書
mkdir -p /data/cert #創(chuàng)建證書目錄 cd /data/cert openssl genrsa -des3 -out server.key 2048 #生成私鑰 //輸入兩遍密碼:123456 openssl req -new -key server.key -out server.csr #生成證書簽名請求文件 //輸入私鑰密碼:123456 //輸入國家名:CN //輸入省名:BJ //輸入市名:BJ //輸入組織名:www //輸入機構(gòu)名:www //輸入域名:hub.wzw.com //輸入管理員郵箱:admin@ydq.com //其它全部直接回車 cp server.key server.key.org #備份私鑰 openssl rsa -in server.key.org -out server.key #清除私鑰密碼:123456,重新生成一個文件,覆蓋以前的帶密碼的。 openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt #簽名證書 chmod +x /data/cert/* #全部添加執(zhí)行權(quán)限 cd /opt/harbor/ ./install.sh #執(zhí)行腳本
5. 訪問
在本地使用瀏覽器訪問:https://hub.dhj.com 添加例外 -> 確認安全例外 用戶名:admin 密碼:Harbor12345
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺網(wǎng)絡模型介紹
這篇文章主要介紹了KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺網(wǎng)絡模型介紹,需要的朋友可以參考下2016-10-10
基于云服務MRS構(gòu)建DolphinScheduler2調(diào)度系統(tǒng)的案例詳解
這篇文章主要介紹了基于云服務MRS構(gòu)建DolphinScheduler2調(diào)度系統(tǒng),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
Rainbond部署組件Statefulset的使用官方文檔
這篇文章主要為大家介紹了官方文檔Rainbond部署組件Statefulset的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
Rainbond云原生部署SpringCloud應用架構(gòu)實踐
這篇文章主要為大家介紹了Rainbond云原生部署SpringCloud應用架構(gòu)實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
kubernetes?Volume存儲卷configMap學習筆記
這篇文章主要為大家介紹了kubernetes?Volume存儲卷configMap學習筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

