1.概述

Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver、Controller-manager、Scheduler...)组成。

整个集群系统运行的交互数据都将存储到数据库服务(Etcd)中,所以Kubernetes集群的高可用性取决于数据库服务(Etcd)在多个控制平面(Master)节点构建的数据同步复制关系。

由此搭建Kubernetes的高可用集群可以选择以下两种部署方式:

使用堆叠的控制平面(Master)节点,其中etcd与组成控制平面的其他组件在同台机器上;

使用外部Etcd节点,其中Etcd与控制平台的其他组件在不同的机器上。

参考文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

1.1.堆叠Etcd拓扑(推荐)

Etcd与其他组件共同运行在多台控制平面(Master)机器上,构建Etcd集群关系以形成高可用的Kubernetes集群。

先决条件:

  • 最少三个或更多奇数Master节点;
  • 最少三个或更多Node节点;
  • 集群中所有机器之间的完整网络连接(公共或专用网络);
  • 使用超级用户权限;
  • 在集群中的任何一个节点上都可以使用SSH远程访问;
  • Kubeadm和Kubelet已经安装到机器上。

使用这种方案可以减少要使用机器的数量,降低成本,降低部署复杂度;多组件服务之间竞争主机资源,可能导致性能瓶颈,以及当Master主机发生故障时影响到所有组件正常工作。

在实际应用中,你可以选择部署更多数量>3的Master主机,则该拓扑的劣势将会减弱!

这是kubeadm中的默认拓扑,kubeadm会在Master节点上自动创建本地etcd成员。

1.2.外部Etcd拓扑

控制平面的Etcd组件运行在外部主机上,其他组件连接到外部的Etcd集群以形成高可用的Kubernetes集群。

先决条件:

  • 最少三个或更多奇数Master主机;
  • 最少三个或更多Node主机;
  • 还需要三台或更多奇数Etcd主机。
  • 集群中所有主机之间的完整网络连接(公共或专用网络);
  • 使用超级用户权限;
  • 在集群中的任何一个节点主机上都可以使用SSH远程访问;
  • Kubeadm和Kubelet已经安装到机器上。

使用外部主机搭建起来的Etcd集群,拥有更多的主机资源和可扩展性,以及故障影响范围缩小,但更多的机器将导致增加部署成本。

2.搭建Kubernetes集群(堆叠Etcd拓扑)

2.1.运行环境与主机规划

主机系统:CentOS Linux release 7.6.1810 (Core)

Kubernetes版本:Kubernetes-1.23.0

Kubernetes与Docker兼容性:v20.10.7+不兼容 -> v20.10.12+不兼容

本文使用Docker版本:Docker-ce-19.03.0

硬件条件:集群中的机器最少需要2GB或者以上的内存,最少需要2核或者以上更多的CPU

主机名 主机地址 主机角色 运行服务
k8s-master01 192.168.124.128
VIP:192.168.124.100
control plane node(master) kube-apiserver
etcd
kube-scheduler
kube-controller-manager
docker
kubelet
keepalived
ipvs
k8s-master02 192.168.124.130
VIP:192.168.124.100
control plane node(master) kube-apiserver
etcd
kube-scheduler
kube-controller-manager
docker
kubelet
keepalived
ipvs
k8s-master03 192.168.124.131
VIP:192.168.124.100
control plane node(master) kube-apiserver
etcd
kube-scheduler
kube-controller-manager
docker
kubelet
keepalived
ipvs
k8s-node01 192.168.124.133 worker node(node) kubelet
kube-proxy
docker

2.2.检查和配置主机环境

1、验证每个主机上的MAC地址和Product_id的唯一性

所有主机上:

  1. [root@localhost ~]# ip link
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
  5. link/ether 00:0c:29:40:e3:9f brd ff:ff:ff:ff:ff:ff
  6. [root@localhost ~]# cat /sys/class/dmi/id/product_uuid
  7. B70F4D56-1F69-3997-AD55-83725A40E39F

2、检查运行Kubernetes所需的端口是否未被占用

角色 协议 方向 服务:端口范围
Master(Control Plane) TCP Inbound Kubernetes API server:6443
etcd server client API:2379-2380
Kubelet API:10250
kube-scheduler:10259
kube-controller-manager:10257
Node(Worker Node) TCP Inbound Kubelet API:10250
NodePort Services+:30000-32767

所有master主机上:

  1. [root@localhost ~]# ss -alnupt |grep -E '6443|10250|10259|10257|2379|2380'

所有node主机上:

  1. [root@localhost ~]# ss -alnupt |grep -E '10250|3[0-2][0-7][0-6][0-7]'

3、配置主机名称

k8s-master01:

  1. [root@localhost ~]# echo "k8s-master01" >/etc/hostname
  2. [root@localhost ~]# cat /etc/hostname | xargs hostname
  3. [root@localhost ~]# bash
  4. [root@k8s-master01 ~]#

k8s-master02:

  1. [root@localhost ~]# echo "k8s-master02" >/etc/hostname
  2. [root@localhost ~]# cat /etc/hostname | xargs hostname
  3. [root@localhost ~]# bash
  4. [root@k8s-master02 ~]#

k8s-master03:

  1. [root@localhost ~]# echo "k8s-master03" >/etc/hostname
  2. [root@localhost ~]# cat /etc/hostname | xargs hostname
  3. [root@localhost ~]# bash
  4. [root@k8s-master03 ~]#

k8s-node01:

  1. [root@localhost ~]# echo "k8s-node01" >/etc/hostname
  2. [root@localhost ~]# cat /etc/hostname | xargs hostname
  3. [root@localhost ~]# bash
  4. [root@k8s-node01 ~]#

4、添加hosts名称解析

所有主机上:

  1. [root@k8s-master01 ~]# cat >> /etc/hosts << EOF
  2. 192.168.124.128 k8s-master01
  3. 192.168.124.130 k8s-master02
  4. 192.168.124.131 k8s-master03
  5. 192.168.124.132 k8s-node01
  6. EOF

5、主机间时间同步

k8s-master01:

设置优先从cn.ntp.org.cn公共时间服务器上同步时间。

  1. # 安装NTP时间服务和NTP客户端
  2. [root@k8s-master01 ~]# yum -y install epel-release.noarch
  3. [root@k8s-master01 ~]# yum -y install ntp ntpdate
  4. # 使用NTP客户端从外部公共NTP时间服务器同步本机时间
  5. [root@k8s-master01 ~]# ntpdate cn.ntp.org.cn
  6. # 配置NTP时间服务
  7. [root@k8s-master01 ~]# vim /etc/ntp.conf
  8. # 访问控制
  9. # 允许外部客户端从本机同步时间,但不允许外部客户端修改本机时间
  10. restrict default nomodify notrap nopeer noquery
  11. restrict 127.0.0.1
  12. restrict ::1
  13. # 从外部服务器主动同步时间
  14. # 如果外部服务器连接失败时则以本机时间为准
  15. server 127.127.1.0
  16. Fudge 127.127.1.0 stratum 10
  17. server cn.ntp.org.cn prefer iburst minpoll 4 maxpoll 10
  18. server ntp.aliyun.com iburst minpoll 4 maxpoll 10
  19. server ntp.tuna.tsinghua.edu.cn iburst minpoll 4 maxpoll 10
  20. server time.ustc.edu.cn iburst minpoll 4 maxpoll 10
  21. # 启动NTP时间服务并设置服务开机自启
  22. [root@k8s-master01 ~]# systemctl start ntpd
  23. [root@k8s-master01 ~]# systemctl enable ntpd
  24. [root@k8s-master01 ~]# systemctl status ntpd
  25. ntpd.service - Network Time Service
  26. Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
  27. Active: active (running) since Mon 2022-03-21 02:59:43 EDT; 4min 52s ago
  28. Process: 27106 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS)
  29. [root@k8s-master01 ~]# ntpstat
  30. synchronised to NTP server (120.25.108.11) at stratum 3
  31. time correct to within 70 ms
  32. polling server every 16 s

其他主机均从k8s-master01主机上同步时间:

  1. # 安装NTP时间服务和NTP客户端
  2. [root@k8s-master02 ~]# yum -y install epel-release.noarch
  3. [root@k8s-master02 ~]# yum -y install ntp ntpdate
  4. # 使用NTP客户端从NTP时间服务器同步本机时间
  5. [root@k8s-master02 ~]# ntpdate 192.168.124.128
  6. # 配置NTP时间服务
  7. [root@k8s-master02 ~]# vim /etc/ntp.conf
  8. # 设置从刚刚搭建的NTP时间服务器主动同步时间
  9. # 如果NTP时间服务器连接失败时则以本机时间为准
  10. server 127.127.1.0
  11. Fudge 127.127.1.0 stratum 10
  12. server 192.168.124.128 prefer iburst minpoll 4 maxpoll 10
  13. # 启动NTP时间服务并设置服务开机自启
  14. [root@k8s-master02 ~]# systemctl start ntpd
  15. [root@k8s-master02 ~]# systemctl enable ntpd
  16. [root@k8s-master02 ~]# systemctl status ntpd
  17. ntpd.service - Network Time Service
  18. Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
  19. Active: active (running) since Mon 2022-03-21 02:59:43 EDT; 4min 52s ago
  20. Process: 27106 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS)
  21. [root@k8s-master02 ~]# ntpstat
  22. synchronised to NTP server (192.168.124.128) at stratum 3
  23. time correct to within 70 ms
  24. polling server every 16 s

6、关闭SWAP

SWAP可能导致容器出现性能下降问题。

所有主机上:

  1. [root@k8s-master01 ~]# swapoff -a # 临时关闭
  2. [root@k8s-master01 ~]# free -mh
  3. total used free shared buff/cache available
  4. Mem: 1.8G 133M 1.4G 9.5M 216M 1.5G
  5. Swap: 0B 0B 0B
  6. [root@k8s-master01 ~]# vim /etc/fstab # 永久关闭
  7. #/dev/mapper/centos-swap swap swap defaults 0 0

7、关闭Firewalld

Kubernetes中的kube-proxy组件需要利用IPtables或者IPVS创建Service对象,CentOS7默认使用Firewalld防火墙服务,为了避免冲突,所以需要禁用和关闭它。

所有主机上:

  1. [root@k8s-master01 ~]# systemctl stop firewalld
  2. [root@k8s-master01 ~]# systemctl disable firewalld
  3. Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
  4. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

8、关闭SeLinux

所有主机上:

  1. [root@k8s-master01 ~]# setenforce 0 # 临时关闭
  2. [root@k8s-master01 ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux # 永久关闭

9、启用bridge-nf功能

开启IPtables的网桥透明工作模式,即二层的流量也会受到IPtables规则影响。

如果该功能模块开机没有加载,则需要加载"br_netfilter"模块。

所有主机上:

  1. [root@k8s-master01 ~]# modprobe br_netfilter
  2. [root@k8s-master01 ~]# lsmod | grep br_netfilter
  3. br_netfilter 22256 0
  4. bridge 151336 1 br_netfilter
  5. [root@k8s-master01 ~]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  6. br_netfilter
  7. EOF
  8. [root@k8s-master01 ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  9. net.bridge.bridge-nf-call-ip6tables = 1
  10. net.bridge.bridge-nf-call-iptables = 1
  11. EOF
  12. [root@k8s-master01 ~]# sysctl --system

10、安装并启用IPVS

kube-proxy组件支持三种工作模式转发流量到Pod:userspace、iptables、ipvs。

如果想要使用ipvs模式则需要安装IPVS。

所有主机上:

  1. [root@k8s-master01 ~]# yum -y install kernel-devel
  2. [root@k8s-master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  3. #!/bin/bash
  4. modprobe -- ip_vs
  5. modprobe -- ip_vs_rr
  6. modprobe -- ip_vs_wrr
  7. modprobe -- ip_vs_sh
  8. modprobe -- nf_conntrack_ipv4
  9. EOF
  10. [root@k8s-master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
  11. [root@k8s-master01 ~]# bash /etc/sysconfig/modules/ipvs.modules
  12. [root@k8s-master01 ~]# lsmod |grep ip_vs
  13. ip_vs_sh 12688 0
  14. ip_vs_wrr 12697 0
  15. ip_vs_rr 12600 0
  16. ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
  17. nf_conntrack 133095 2 ip_vs,nf_conntrack_ipv4
  18. libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
  19. [root@k8s-master01 ~]# yum -y install ipset ipvsadm

2.3.安装容器运行平台(Docker)

容器运行平台用于承载和管理运行容器应用。

配置Docker在线镜像源为国内镜像源,官方推荐使用的cgroup驱动为"systemd"。

所有主机上:

  1. # 安装指定版本的docker
  2. [root@k8s-master01 ~]# yum -y install epel-release.noarch yum-utils
  3. [root@k8s-master01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. [root@k8s-master01 ~]# yum -y install device-mapper-persistent-data lvm2
  5. [root@k8s-master01 ~]# yum list docker-ce --showduplicates | sort -r
  6. [root@k8s-master01 ~]# yum -y install docker-ce-19.03.0
  7. [root@k8s-master01 ~]# systemctl start docker
  8. [root@k8s-master01 ~]# systemctl enable docker
  9. # 配置docker
  10. [root@k8s-master01 ~]# cat > /etc/docker/daemon.json <<EOF
  11. {
  12. "registry-mirrors": [
  13. "https://7mimmp7p.mirror.aliyuncs.com",
  14. "https://registry.docker-cn.com",
  15. "http://hub-mirror.c.163.com",
  16. "https://docker.mirrors.ustc.edu.cn"
  17. ],
  18. "exec-opts": ["native.cgroupdriver=systemd"],
  19. "log-driver": "json-file",
  20. "log-opts": {
  21. "max-size": "100m"
  22. },
  23. "storage-driver": "overlay2",
  24. "storage-opts": [
  25. "overlay2.override_kernel_check=true"
  26. ]
  27. }
  28. EOF
  29. [root@k8s-master01 ~]# systemctl restart docker
  30. [root@k8s-master01 ~]# systemctl status docker
  31. docker.service - Docker Application Container Engine
  32. Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  33. Active: active (running) since Mon 2022-03-21 06:26:38 EDT; 4s ago
  34. [root@k8s-master01 ~]# docker info | grep Cgroup
  35. Cgroup Driver: systemd

2.4.安装Kubeadm、Kubelet、Kubectl

kubeadm,引导构建集群所使用的工具。

kubelet,在集群中所有机器上要运行的组件,用于管理Pod和容器。

kubectl,在命令行操作和使用集群的客户端工具。

在所有主机上:

  1. [root@k8s-master01 ~]# cat <<EOF >/etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF
  10. [root@k8s-master01 ~]# yum install -y kubelet-1.23.0 kubectl-1.23.0 kubeadm-1.23.0 --disableexcludes=kubernetes --nogpgcheck
  11. [root@k8s-master01 ~]# systemctl enable kubelet
  12. [root@k8s-master01 ~]# cat > /etc/sysconfig/kubelet <<EOF
  13. KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  14. EOF

2.5.创建负载均衡器(HAProxy+Keepalived)

参考文档:https://github.com/kubernetes/kubeadm/blob/main/docs/ha-considerations.md#options-for-software-load-balancing

当存在多个控制平面时,kube-apiserver也存在多个,可以使用Nginx+Keepalived、HAProxy+Keepalived等工具实现多个kube-apiserver的负载均衡和高可用。

推荐使用HAProxy+Keepalived这个组合,因为HAProxy可以提高更高性能的四层负载均衡功能,这也是大多数人的选择。

1、安装HAProxy、Keepalived

HAProxy可以实现对后端APIServer的负载均衡与健康检查,不会转发请求到不可用的APIServer,以避免失败的请求。

  1. [root@k8s-master01 ~]# yum -y install haproxy keepalived

2、配置并启动HAProxy

启动的HAProxy服务由于后端的api-server还没有部署运行,需要等待Kubernetes初始化完成才可以正常接受处理请求!

在所有master主机上:

  1. [root@k8s-master01 ~]# vim /etc/haproxy/haproxy.cfg
  2. global
  3. log 127.0.0.1 local2 emerg info
  4. chroot /var/lib/haproxy
  5. pidfile /var/run/haproxy.pid
  6. maxconn 4000
  7. user haproxy
  8. group haproxy
  9. daemon
  10. # turn on stats unix socket
  11. stats socket /var/lib/haproxy/stats
  12. #---------------------------------------------------------------------
  13. # common defaults that all the 'listen' and 'backend' sections will
  14. # use if not designated in their block
  15. #---------------------------------------------------------------------
  16. defaults
  17. mode http
  18. log global
  19. option httplog
  20. option dontlognull
  21. option http-server-close
  22. option forwardfor except 127.0.0.0/8
  23. option redispatch
  24. retries 3
  25. timeout http-request 10s
  26. timeout queue 1m
  27. timeout connect 10s
  28. timeout client 1m
  29. timeout server 1m
  30. timeout http-keep-alive 10s
  31. timeout check 10s
  32. maxconn 3000
  33. #---------------------------------------------------------------------
  34. # apiserver frontend which proxys to the control plane nodes
  35. #---------------------------------------------------------------------
  36. frontend apiserver
  37. bind *:9443
  38. mode tcp
  39. option tcplog
  40. default_backend apiserver
  41. #---------------------------------------------------------------------
  42. # round robin balancing for apiserver
  43. #---------------------------------------------------------------------
  44. backend apiserver
  45. mode tcp
  46. balance roundrobin
  47. server k8s-master01 192.168.124.128:6443 check
  48. server k8s-master02 192.168.124.130:6443 check
  49. server k8s-master03 192.168.124.131:6443 check
  50. [root@k8s-master01 ~]# haproxy -f /etc/haproxy/haproxy.cfg -c
  51. Configuration file is valid
  52. [root@k8s-master01 ~]# systemctl start haproxy
  53. [root@k8s-master01 ~]# systemctl enable haproxy
  54. [root@k8s-master01 ~]# netstat -lnupt |grep 9443
  55. tcp 0 0 0.0.0.0:9443 0.0.0.0:* LISTEN 44965/haproxy
  56. [root@k8s-master01 ~]# curl localhost:9443
  57. curl: (52) Empty reply from server

3、配置并重启rsyslog

HAProxy采用rsyslog记录日志,日志有助于后续我们观察和分析问题。

所有master主机上:

  1. [root@k8s-master01 ~]# vim /etc/rsyslog.conf
  2. local2.* /var/log/haproxy.log
  3. [root@k8s-master01 ~]# systemctl restart rsyslog
  4. [root@k8s-master01 ~]# systemctl status rsyslog
  5. rsyslog.service - System Logging Service
  6. Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
  7. Active: active (running) since Tue 2022-04-12 16:39:50 CST; 2h 11min ago

4、配置Keeaplived

配置Keepalived以实现HAProxy的高可用性,当A主负载均衡器不可用时,还有B、C备用负载均衡器继续提供服务。

配置基于脚本(vrrp_script)的健康检查,当检查失败时,权重-2,即优先级-2,这时候就会发生主备切换。

k8s-master01(MASTER):

  1. [root@k8s-master01 ~]# vim /etc/keepalived/keepalived.conf
  2. ! /etc/keepalived/keepalived.conf
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id 192.168.124.128
  6. }
  7. vrrp_script check_haproxy {
  8. script "bash -c 'if [ $(ss -alnupt |grep 9443|wc -l) -eq 0 ];then exit 1;fi'"
  9. interval 3
  10. weight -2
  11. fall 3
  12. rise 3
  13. }
  14. vrrp_instance VI_1 {
  15. state MASTER
  16. interface ens33
  17. virtual_router_id 50
  18. priority 100
  19. authentication {
  20. auth_type PASS
  21. auth_pass 123456
  22. }
  23. virtual_ipaddress {
  24. 192.168.124.100
  25. }
  26. track_script {
  27. check_haproxy
  28. }
  29. }

k8s-master02(BACKUP):

  1. [root@k8s-master02 ~]# vim /etc/keepalived/keepalived.conf
  2. ! /etc/keepalived/keepalived.conf
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id 192.168.124.130
  6. }
  7. vrrp_script check_haproxy {
  8. script "bash -c 'if [ $(ss -alnupt |grep 9443|wc -l) -eq 0 ];then exit 1;fi'"
  9. interval 3
  10. weight -2
  11. fall 3
  12. rise 3
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. virtual_router_id 50
  18. priority 99
  19. authentication {
  20. auth_type PASS
  21. auth_pass 123456
  22. }
  23. virtual_ipaddress {
  24. 192.168.124.100
  25. }
  26. track_script {
  27. check_haproxy
  28. }
  29. }

k8s-master03(BACKUP):

  1. [root@k8s-master03 ~]# vim /etc/keepalived/keepalived.conf
  2. ! /etc/keepalived/keepalived.conf
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id 192.168.124.131
  6. }
  7. vrrp_script check_haproxy {
  8. script "bash -c 'if [ $(ss -alnupt |grep 9443|wc -l) -eq 0 ];then exit 1;fi'"
  9. interval 3
  10. weight -2
  11. fall 3
  12. rise 3
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. virtual_router_id 50
  18. priority 98
  19. authentication {
  20. auth_type PASS
  21. auth_pass 123456
  22. }
  23. virtual_ipaddress {
  24. 192.168.124.100
  25. }
  26. track_script {
  27. check_haproxy
  28. }
  29. }

5、启动并设置Keepalived开机自启

所有master主机上:

  1. [root@k8s-master01 ~]# systemctl start keepalived
  2. [root@k8s-master01 ~]# systemctl status keepalived
  3. keepalived.service - LVS and VRRP High Availability Monitor
  4. Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
  5. Active: active (running) since Mon 2022-03-21 11:48:06 EDT; 4min 0s ago
  6. Main PID: 48653 (keepalived)
  7. [root@k8s-master01 ~]# systemctl enable keepalived

6、查看VIP是否在MASTER主机上

  1. [root@k8s-master01 ~]# ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:40:e3:9f brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.124.128/24 brd 192.168.124.255 scope global dynamic ens33
  11. valid_lft 1057sec preferred_lft 1057sec
  12. inet 192.168.124.100/32 scope global ens33
  13. valid_lft forever preferred_lft forever

7、测试:主故障时自动切换至备

主故障自动切换:

停止MASTER主机上的HAProxy服务,这个时候检查脚本触发优先级-2,则就会发生主备切换,VIP则会漂移到另外一台优先级较低的BACKUP主机上以代替成为新的MASTER。

以下可以看出VIP已经漂移到了k8s-master02上。

  1. [root@k8s-master01 ~]# systemctl stop haproxy
  2. [root@k8s-master01 ~]# ip addr
  3. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  4. link/ether 00:0c:29:40:e3:9f brd ff:ff:ff:ff:ff:ff
  5. inet 192.168.124.128/24 brd 192.168.124.255 scope global dynamic ens33
  6. valid_lft 1451sec preferred_lft 1451sec
  7. [root@k8s-master02 ~]# ip addr
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:c4:65:67 brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.124.130/24 brd 192.168.124.255 scope global dynamic ens33
  11. valid_lft 1320sec preferred_lft 1320sec
  12. inet 192.168.124.100/32 scope global ens33
  13. valid_lft forever preferred_lft forever

主故障后恢复:

当MASTER主机上的HAProxy服务恢复时,这个时候检查脚本触发优先级+2,也会发生切换,VIP会漂移到优先级更高的已恢复正常的MASTER主机继续作为MASTER提供服务。

  1. [root@k8s-master01 ~]# systemctl start haproxy
  2. [root@k8s-master01 ~]# ip addr
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. inet6 ::1/128 scope host
  8. valid_lft forever preferred_lft forever
  9. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  10. link/ether 00:0c:29:40:e3:9f brd ff:ff:ff:ff:ff:ff
  11. inet 192.168.124.128/24 brd 192.168.124.255 scope global dynamic ens33
  12. valid_lft 1175sec preferred_lft 1175sec
  13. inet 192.168.124.100/32 scope global ens33
  14. valid_lft forever preferred_lft forever

2.6.部署并构建Kubernetes集群

1、准备镜像

可以使用以下命令查看kubeadm-v1.23.0部署kubernetes-v1.23.0所需要的镜像列表以及默认所使用的的镜像来源。

所有主机上:

  1. [root@k8s-master01 ~]# kubeadm config print init-defaults |grep imageRepository
  2. imageRepository: k8s.gcr.io
  3. [root@k8s-master01 ~]# kubeadm config images list --kubernetes-version 1.23.0
  4. k8s.gcr.io/kube-apiserver:v1.23.0
  5. k8s.gcr.io/kube-controller-manager:v1.23.0
  6. k8s.gcr.io/kube-scheduler:v1.23.0
  7. k8s.gcr.io/kube-proxy:v1.23.0
  8. k8s.gcr.io/pause:3.6
  9. k8s.gcr.io/etcd:3.5.1-0
  10. k8s.gcr.io/coredns/coredns:v1.8.6

由于访问k8s.gcr.io可能需要FQ,所以我们可以在国内的镜像仓库中下载它们(比如使用阿里云镜像仓库。阿里云代理镜像仓库地址:registry.aliyuncs.com/google_containers

如果你需要在更多台主机上使用它们,则可以考虑使用Harbor或Docker Register搭建私有化镜像仓库。

所有主机上:

  1. # 从镜像仓库中拉取镜像
  2. [root@k8s-master01 ~]# kubeadm config images pull --kubernetes-version=v1.23.0 --image-repository=registry.aliyuncs.com/google_containers
  3. [config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
  4. [config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
  5. [config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
  6. [config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.23.0
  7. [config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.6
  8. [config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.1-0
  9. [config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.8.6
  10. # 查看本地镜像列表
  11. [root@k8s-master01 ~]# docker images |grep 'registry.aliyuncs.com/google_containers'
  12. registry.aliyuncs.com/google_containers/kube-apiserver v1.23.0 e6bf5ddd4098 4 months ago 135MB
  13. registry.aliyuncs.com/google_containers/kube-controller-manager v1.23.0 37c6aeb3663b 4 months ago 125MB
  14. registry.aliyuncs.com/google_containers/kube-proxy v1.23.0 e03484a90585 4 months ago 112MB
  15. registry.aliyuncs.com/google_containers/kube-scheduler v1.23.0 56c5af1d00b5 4 months ago 53.5MB
  16. registry.aliyuncs.com/google_containers/etcd 3.5.1-0 25f8c7f3da61 5 months ago 293MB
  17. registry.aliyuncs.com/google_containers/coredns v1.8.6 a4ca41631cc7 6 months ago 46.8MB
  18. registry.aliyuncs.com/google_containers/pause 3.6 6270bb605e12 7 months ago 683kB

2、准备kubeadm-init配置文件

kubeadm相关配置可以参考文档:https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/

k8s-master01:

  1. [root@k8s-master01 ~]# kubeadm config print init-defaults > kubeadm-init.yaml
  2. [root@k8s-master01 ~]# vim kubeadm-init.yaml
  3. apiVersion: kubeadm.k8s.io/v1beta3
  4. bootstrapTokens:
  5. - groups:
  6. - system:bootstrappers:kubeadm:default-node-token
  7. token: abcdef.0123456789abcdef
  8. ttl: "0" # 设置引导令牌的永不过期
  9. usages:
  10. - signing
  11. - authentication
  12. kind: InitConfiguration
  13. localAPIEndpoint:
  14. advertiseAddress: 192.168.124.128 # 绑定APIServer要监听的本机IP地址
  15. bindPort: 6443
  16. nodeRegistration:
  17. criSocket: /var/run/dockershim.sock
  18. imagePullPolicy: IfNotPresent
  19. name: k8s-master01 # 节点名称
  20. taints: null
  21. ---
  22. controlPlaneEndpoint: "192.168.124.100:9443" # 控制平面入口点地址:"负载均衡器VIP或DNS:负载均衡器端口"
  23. apiServer:
  24. timeoutForControlPlane: 4m0s
  25. apiVersion: kubeadm.k8s.io/v1beta3
  26. certificatesDir: /etc/kubernetes/pki
  27. clusterName: kubernetes
  28. controllerManager: {}
  29. dns: {}
  30. etcd:
  31. local:
  32. dataDir: /var/lib/etcd
  33. imageRepository: registry.aliyuncs.com/google_containers # 设置部署集群时要使用的镜像仓库地址
  34. kind: ClusterConfiguration
  35. kubernetesVersion: 1.23.0 # 设置要部署的kubernetes版本
  36. networking:
  37. dnsDomain: cluster.local
  38. serviceSubnet: 10.96.0.0/12
  39. scheduler: {}
  40. ---
  41. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  42. kind: KubeProxyConfiguration
  43. mode: ipvs # 设置kube-proxy工作模式为ipvs

3、安装kubeadm_src,防止kubernetes证书过期(可选步骤)

在Kubernetes中,客户端与APIServer通信需要使用X509证书,各组件之间也是使用证书进行身份验证的,由于官方默认使用kubeadm创建的相关证书有效期只有一年,如果证书到期后可能导致集群不可用,这非常严重。

所以我们这里对kubernetes源码进行修改后编译生成后的kubeadm(重命名为kubeadm_src)初始化控制平面节点,在初始化的过程中会生成有效期为其100年的的kubernetes证书!

k8s-master01:

  1. # 安装GO
  2. [root@k8s-master01 ~]# wget https://go.dev/dl/go1.17.8.linux-amd64.tar.gz
  3. [root@k8s-master01 ~]# tar xzvf go1.17.8.linux-amd64.tar.gz -C /usr/local
  4. [root@k8s-master01 ~]# vim /etc/profile
  5. export PATH=$PATH:/usr/local/go/bin
  6. export GO111MODULE=auto
  7. export GOPROXY=https://goproxy.cn
  8. [root@k8s-master01 ~]# source /etc/profile
  9. [root@k8s-master01 ~]# go version
  10. go version go1.17.8 linux/amd64
  11. # 从GITHUB克隆官方代码
  12. [root@k8s-master01 ~]# yum -y install git
  13. [root@k8s-master01 ~]# git clone https://github.91chi.fun/https://github.com/kubernetes/kubernetes.git
  14. [root@k8s-master01 ~]# cd kubernetes
  15. [root@k8s-master01 kubernetes]# git tag -l
  16. ...
  17. v1.23.0
  18. ...
  19. [root@k8s-master01 kubernetes]# git checkout -b v1.23.0 v1.23.0
  20. # 修改证书有效期相关代码
  21. [root@k8s-master01 kubernetes]# vim cmd/kubeadm/app/constants/constants.go
  22. const (
  23. ...
  24. // CertificateValidity defines the validity for all the signed certificates generated by kubeadm
  25. // CertificateValidity = time.Hour * 24 * 365
  26. CertificateValidity = time.Hour * 24 * 365 * 100
  27. ...
  28. }
  29. [root@k8s-master01 kubernetes]# vim staging/src/k8s.io/client-go/util/cert/cert.go
  30. ...
  31. // NewSelfSignedCACert creates a CA certificate
  32. func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
  33. now := time.Now()
  34. tmpl := x509.Certificate{
  35. SerialNumber: new(big.Int).SetInt64(0),
  36. Subject: pkix.Name{
  37. CommonName: cfg.CommonName,
  38. Organization: cfg.Organization,
  39. },
  40. DNSNames: []string{cfg.CommonName},
  41. NotBefore: now.UTC(),
  42. //NotAfter: now.Add(duration365d * 10).UTC(),
  43. NotAfter: now.Add(duration365d * 100).UTC(),
  44. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
  45. BasicConstraintsValid: true,
  46. IsCA: true,
  47. }
  48. }
  49. ...
  50. # 编译生成新的kubeadm命令,这将会输出到_output/bin/目录下
  51. [root@k8s-master01 kubernetes]# make WHAT=cmd/kubeadm GOFLAGS=-v
  52. # 拷贝kubeadm到所有节点主机的/usr/bin目录下,并重命名为kubeadm_src
  53. [root@k8s-master01 kubernetes]# cd _output/bin/ && cp -rf kubeadm /usr/bin/kubeadm_src
  54. [root@k8s-master01 bin]# scp kubeadm root@k8s-master02:/usr/bin/kubeadm_src
  55. [root@k8s-master01 bin]# scp kubeadm root@k8s-master03:/usr/bin/kubeadm_src
  56. [root@k8s-master01 bin]# scp kubeadm root@k8s-node01:/usr/bin/kubeadm_src

4、基于kubeadm-init配置并使用源码编译的kubeadm创建一个初始化控制平面节点

kubeadm在初始化控制平面时会生成部署Kubernetes集群中各个组件所需的相关配置文件在/etc/kubernetes目录下,可以供我们参考。

注:由于源码生成kubeadm在初始化节点的时候无法正确的配置YUM安装的kubelet服务,所以需要YUM安装的kubeadm先配置kubelet服务!

初始化完成后的提示信息和后续执行命令需要保存一下!

k8s-master01:

  1. # 使用YUM安装的kubeadm初始配置kubelet
  2. [root@k8s-master01 ~]# kubeadm init phase kubelet-start --config kubeadm-init.yaml
  3. # 使用源码编译的kubeadm初始化控制平面节点
  4. [root@k8s-master01 ~]# kubeadm_src init --config kubeadm-init.yaml --upload-certs
  5. Your Kubernetes control-plane has initialized successfully!
  6. 你的Kubernetes控制平面已初始化成功!
  7. To start using your cluster, you need to run the following as a regular user:
  8. 你的集群是启动状态,如果你是普通用户的话请继续执行以下命令:
  9. mkdir -p $HOME/.kube
  10. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  11. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  12. Alternatively, if you are the root user, you can run:
  13. 或者,如果你是root用户的话请继续执行以下命令:
  14. export KUBECONFIG=/etc/kubernetes/admin.conf
  15. You should now deploy a pod network to the cluster.
  16. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  17. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  18. 你还需要在集群上部署一个Pod网络插件!
  19. You can now join any number of the control-plane node running the following command on each as root:
  20. 你如果需要更多数量的控制平面节点加入到集群的话,请使用root用户在节点执行以下命令:
  21. kubeadm join 192.168.124.100:9443 --token abcdef.0123456789abcdef \
  22. --discovery-token-ca-cert-hash sha256:64c918139d7d344b64b0720244077b60ea10f5572717f92113c08fe9c56be3c9 \
  23. --control-plane --certificate-key 5d87ca735c040ba6b04de388f2857530bbd9de094cbd43810904afe9a6aec50d
  24. Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
  25. As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
  26. "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
  27. 证书的访问密钥有效期只有2小时,如果你还需要部署更多的节点,请先执行"kubeadm init phase upload-certs --upload-certs"重新上传证书到kubeadm-certs
  28. Then you can join any number of worker nodes by running the following on each as root:
  29. 你如果需要更多数量的工作节点加入到集群的话,请使用root用户在节点上执行以下命令:
  30. kubeadm join 192.168.124.100:9443 --token abcdef.0123456789abcdef \
  31. --discovery-token-ca-cert-hash sha256:64c918139d7d344b64b0720244077b60ea10f5572717f92113c08fe9c56be3c9

5、将正确的kubelet服务配置文件拷贝到其他主机

k8s-master01:

  1. [root@k8s-master01 ~]# systemctl status kubelet
  2. kubelet.service - kubelet: The Kubernetes Node Agent
  3. Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  4. Drop-In: /usr/lib/systemd/system/kubelet.service.d
  5. └─10-kubeadm.conf
  6. [root@k8s-master01 ~]# scp -r /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf root@k8s-master02:/usr/lib/systemd/system/kubelet.service.d
  7. [root@k8s-master01 ~]# scp -r /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf root@k8s-master03:/usr/lib/systemd/system/kubelet.service.d
  8. [root@k8s-master01 ~]# scp -r /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf root@k8s-node01:/usr/lib/systemd/system/kubelet.service.d

其他主机上重载服务配置:

  1. [root@k8s-master02 ~]# systemctl daemon-reload

6、其他节点加入到集群

请使用源码编译后的kubeadm命令!

其他控制平面节点加入到集群:

  1. [root@k8s-master02 ~]# kubeadm_src join 192.168.124.100:9443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:64c918139d7d344b64b0720244077b60ea10f5572717f92113c08fe9c56be3c9 --control-plane --certificate-key 5d87ca735c040ba6b04de388f2857530bbd9de094cbd43810904afe9a6aec50d

工作节点加入到集群:

  1. [root@k8s-node01 ~]# kubeadm_src join 192.168.124.100:9443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:64c918139d7d344b64b0720244077b60ea10f5572717f92113c08fe9c56be3c9

7、观察Etcd

可见Etcd是以集群的方式运行的!

  1. [root@k8s-master03 ~]# ps aux |grep etcd
  2. root 1971 5.4 4.5 11283128 84128 ? Ssl 16:33 1:00 etcd --advertise-client-urls=https://192.168.124.131:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://192.168.124.131:2380 --initial-cluster=k8s-master03=https://192.168.124.131:2380,k8s-master01=https://192.168.124.128:2380,k8s-master02=https://192.168.124.130:2380 --initial-cluster-state=existing --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.124.131:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.124.131:2380 --name=k8s-master03 --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

8、查看Kubernetes证书有效期

  1. [root@k8s-master01 ~]# kubeadm certs check-expiration
  2. [check-expiration] Reading configuration from the cluster...
  3. [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
  4. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  5. admin.conf Mar 18, 2122 04:38 UTC 99y no
  6. apiserver Mar 18, 2122 04:38 UTC 99y ca no
  7. apiserver-etcd-client Mar 18, 2122 04:38 UTC 99y etcd-ca no
  8. apiserver-kubelet-client Mar 18, 2122 04:38 UTC 99y ca no
  9. controller-manager.conf Mar 18, 2122 04:38 UTC 99y no
  10. etcd-healthcheck-client Mar 18, 2122 04:38 UTC 99y etcd-ca no
  11. etcd-peer Mar 18, 2122 04:38 UTC 99y etcd-ca no
  12. etcd-server Mar 18, 2122 04:38 UTC 99y etcd-ca no
  13. front-proxy-client Mar 18, 2122 04:38 UTC 99y front-proxy-ca no
  14. scheduler.conf Mar 18, 2122 04:38 UTC 99y no
  15. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  16. ca Mar 18, 2122 04:38 UTC 99y no
  17. etcd-ca Mar 18, 2122 04:38 UTC 99y no
  18. front-proxy-ca Mar 18, 2122 04:38 UTC 99y no

9、设置kubectl客户端以连接到集群

节点在部署完成时,会生成用于kubectl登录所使用的kubeconfig配置文件在"/etc/kubernetes/admin.conf"!

所有master主机上:

  1. [root@k8s-master01 ~]# mkdir -p $HOME/.kube
  2. [root@k8s-master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. [root@k8s-master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

10、查看集群中节点列表

可见所有节点都是"NotReady"未就绪状态,这需要在集群中安装Pod网络插件!

  1. [root@k8s-master01 ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master01 NotReady control-plane,master 145m v1.23.0
  4. k8s-master02 NotReady control-plane,master 144m v1.23.0
  5. k8s-master03 NotReady control-plane,master 143m v1.23.0
  6. k8s-node01 NotReady <none> 76m v1.23.0
  7. [root@k8s-master01 ~]# kubectl describe nodes k8s-master01
  8. Name: k8s-master01
  9. ...
  10. Conditions:
  11. Type Status LastHeartbeatTime LastTransitionTime Reason Message
  12. ---- ------ ----------------- ------------------ ------
  13. KubeletNotReady container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

3.安装一些必要的插件

3.1.安装Pod网络插件(CNI)-Calico

Calico是一个开源的虚拟化网络方案,支持基础的Pod网络通信和网络策略功能。

Kubernetes有一种资源类型"NetworkPolicy",用于描述Pod的网络策略,要想使用该资源类型,则需要Pod网络插件支持网络策略功能。

参考文档:https://github.com/projectcalico/calico

任意一台master主机上:

  1. [root@k8s-master01 ~]# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
  2. [root@k8s-master01 ~]# kubectl apply -f calico.yaml
  3. configmap/calico-config created
  4. customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
  5. customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
  6. customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
  7. customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
  8. customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
  9. customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
  10. customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
  11. customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
  12. customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
  13. customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
  14. customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
  15. customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
  16. customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
  17. customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
  18. customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
  19. customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
  20. customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
  21. clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
  22. clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
  23. clusterrole.rbac.authorization.k8s.io/calico-node created
  24. clusterrolebinding.rbac.authorization.k8s.io/calico-node created
  25. daemonset.apps/calico-node created
  26. serviceaccount/calico-node created
  27. deployment.apps/calico-kube-controllers created
  28. serviceaccount/calico-kube-controllers created
  29. Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
  30. poddisruptionudget.policy/calico-kube-controllers created

安装完成后可以看到Calico会在集群中创建并运行对应Pod,并且此时所有的Node已经是就绪状态:

  1. [root@k8s-master01 ~]# kubectl get pods -n kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. calico-kube-controllers-56fcbf9d6b-phf49 1/1 Running 0 12m
  4. calico-node-8frvw 1/1 Running 0 12m
  5. calico-node-mzpmv 1/1 Running 0 12m
  6. calico-node-rblcg 1/1 Running 0 12m
  7. calico-node-vh9c9 1/1 Running 0 12m
  8. coredns-6d8c4cb4d-85b5t 1/1 Running 0 39m
  9. coredns-6d8c4cb4d-h7ttw 1/1 Running 0 38m
  10. [root@k8s-master01 ~]# kubectl get nodes
  11. NAME STATUS ROLES AGE VERSION
  12. k8s-master01 Ready control-plane,master 28h v1.23.0
  13. k8s-master02 Ready control-plane,master 28h v1.23.0
  14. k8s-master03 Ready control-plane,master 28h v1.23.0
  15. k8s-node01 Ready <none> 27h v1.23.0

3.2.安装Ingress控制器-Ingress-Nginx

Ingress是Kubernetes标准的资源类型之一,用于描述Service的七层实现,实现基于HTTP协议的反向代理功能,这在Web项目中是经常要用的。

"Ingress"功能的提供由Ingress控制器(插件)实现,ingress-nginx是常用的Ingress控制器。

参考文档:

https://github.com/kubernetes/ingress-nginx

https://kubernetes.github.io/ingress-nginx/deploy/

1、查看兼容版本

  1. Ingress-NGINX version k8s supported version Alpine Version Nginx Version
  2. v1.1.3 1.23, 1.22, 1.21, 1.20, 1.19 3.14.4 1.19.10
  3. v1.1.2 1.23, 1.22, 1.21, 1.20, 1.19 3.14.2 1.19.9
  4. v1.1.1 1.23, 1.22, 1.21, 1.20, 1.19 3.14.2 1.19.9

2、搜索国内镜像源

注:这边需要修改一下镜像源为国内克隆镜像源,否则可能无法下载镜像。

可以去DockerHUB中搜索一下对应版本的相关镜像!



3、安装Ingress-Nginx-Controller

  1. [root@k8s-master01 ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/deploy.yaml -O ingress-nginx.yaml
  2. [root@k8s-master01 ~]# vim ingress-nginx.yaml
  3. #image: k8s.gcr.io/ingress-nginx/controllerv1.1.2@...
  4. image: willdockerhub/ingress-nginx-controller:v1.1.2
  5. #image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@...
  6. image: liangjw/kube-webhook-certgen:v1.1.1
  7. [root@k8s-master01 ~]# kubectl apply -f ingress-nginx.yaml
  8. namespace/ingress-nginx created
  9. serviceaccount/ingress-nginx created
  10. serviceaccount/ingress-nginx-admission created
  11. role.rbac.authorization.k8s.io/ingress-nginx created
  12. role.rbac.authorization.k8s.io/ingress-nginx-admission created
  13. clusterrole.rbac.authorization.k8s.io/ingress-nginx created
  14. clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
  15. rolebinding.rbac.authorization.k8s.io/ingress-nginx created
  16. rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
  17. clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
  18. clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
  19. configmap/ingress-nginx-controller created
  20. service/ingress-nginx-controller created
  21. service/ingress-nginx-controller-admission created
  22. deployment.apps/ingress-nginx-controller created
  23. job.batch/ingress-nginx-admission-create created
  24. job.batch/ingress-nginx-admission-patch created
  25. ingressclass.networking.k8s.io/nginx created
  26. validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

4、查看运行状态

  1. [root@k8s-master01 ~]# kubectl get pods --namespace=ingress-nginx
  2. NAME READY STATUS RESTARTS AGE
  3. ingress-nginx-admission-create-6xk5t 0/1 Completed 0 11m
  4. ingress-nginx-admission-patch-sp6w2 0/1 Completed 0 11m
  5. ingress-nginx-controller-7bc7476f95-gdxkz 1/1 Running 0 11m

5、使用外部负载均衡器关联Ingress控制器

外部主机想要访问到Pod-Ingress控制器需要通过Service,默认情况下使用.yaml安装Ingress-nginx-controller时会创建LoadBalancer类型的Service,以用于外部负载均衡器关联并将访问请求转发至Ingress控制器处理。

LoadBalancer类型的Service是NodePort类型的上层实现,同理它会在每台节点主机上都开放一个映射端口,可用于外部负载均衡器进行关联。

  1. [root@k8s-master01 ~]# kubectl get service --namespace=ingress-nginx
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. ingress-nginx-controller LoadBalancer 10.103.77.111 <pending> 80:30408/TCP,443:32686/TCP 20m
  4. ingress-nginx-controller-admission ClusterIP 10.98.133.60 <none> 443/TCP 20m
  5. [root@k8s-master01 ~]# netstat -lnupt |grep -E '30408|32686'
  6. tcp 1 0 0.0.0.0:30408 0.0.0.0:* LISTEN 41631/kube-proxy
  7. tcp 0 0 0.0.0.0:32686 0.0.0.0:* LISTEN 41631/kube-proxy

3.3.安装Metrics-Server

Metrices-Server,指标服务器,Metrices-Server是Kubernetes中的一个常用插件,它类似于Top命令,可以查看Kubernetes中Node和Pod的CPU和内存资源使用情况。

Metrices-Server每15秒收集一次指标,它在集群中的每个节点中运行,可扩展支持多达5000个节点的集群。

Metrices-Server从0.5版本开始默认情况下要求节点上需要的资源请求为100m的CPU和200MiB的内存,以保证100+节点数量的性能是良好的。

参考文档:https://github.com/kubernetes-sigs/metrics-server

1、查看与Kuberneres的兼容性

  1. Metrics Server Metrics API group/version Supported Kubernetes version
  2. 0.6.x metrics.k8s.io/v1beta1 1.19+
  3. 0.5.x metrics.k8s.io/v1beta1 *1.8+
  4. 0.4.x metrics.k8s.io/v1beta1 *1.8+
  5. 0.3.x metrics.k8s.io/v1beta1 1.8-1.21

2、搜索国内克隆镜像

官方的安装清单components.yaml默认情况下使用的镜像仓库为k8s.gcr.io,在没有FQ的情况下Pod运行可能无法正常获取到Metrics-Server的安装镜像。

3、安装Metrics-Server

Metrics-Server默认情况下在启动的时候需要验证kubelet提供的CA证书,这可能会导致其启动失败,所以需要添加参数"--kubelet-insecure-tls"禁用此校验证书功能。

  1. [root@k8s-master01 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server.yaml
  2. [root@k8s-master01 ~]# vim metrics-server.yaml
  3. spec:
  4. containers:
  5. - args:
  6. - --kubelet-insecure-tls
  7. - --cert-dir=/tmp
  8. - --secure-port=4443
  9. - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
  10. - --kubelet-use-node-status-port
  11. - --metric-resolution=15s
  12. image: bitnami/metrics-server:0.6.1
  13. [root@k8s-master01 ~]# kubectl apply -f metrics-server.yaml
  14. serviceaccount/metrics-server created
  15. clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
  16. clusterrole.rbac.authorization.k8s.io/system:metrics-server created
  17. rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
  18. clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
  19. clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
  20. service/metrics-server created
  21. deployment.apps/metrics-server created
  22. apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
  23. [root@k8s-master01 ~]# kubectl get pods --namespace=kube-system |grep -E 'NAME|metrics-server'
  24. NAME READY STATUS RESTARTS AGE
  25. metrics-server-599b4c96ff-njg8b 1/1 Running 0 76s

4、查看集群中节点的资源使用情况

  1. [root@k8s-master01 ~]# kubectl top node
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. k8s-master01 331m 8% 1177Mi 68%
  4. k8s-master02 419m 10% 1216Mi 70%
  5. k8s-master03 344m 8% 1155Mi 67%
  6. k8s-node01 246m 6% 997Mi 57%

5、查看集群中指定名称空间下Pod的资源使用情况

  1. [root@k8s-master01 ~]# kubectl top pod --namespace=kube-system
  2. NAME CPU(cores) MEMORY(bytes)
  3. calico-kube-controllers-56fcbf9d6b-phf49 5m 29Mi
  4. calico-node-8frvw 98m 120Mi
  5. calico-node-mzpmv 71m 121Mi
  6. ...

3.4.安装Dashboard

Kubernetes Dashboard是Kubernetes集群的通用、基于Web的UI。它允许用户管理集群中运行的应用程序并对其进行故障排除,以及管理集群本身。

Dashboard是Kubernetes的一个插件,由APIServer提供的一个URL提供访问入口:/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy

当前你也可以通过Service直接访问到DashBoard!

参考文档:

https://github.com/kubernetes/dashboard

https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md#login-not-available

1、安装Dashboard

根据配置清单安装Dashboard,会创建Cluster类型的Service,仅只能从集群内部主机访问到Dashboard,所以这边需要简单修改一下,将Service修改为NodePort类型,这样外部主机也可以访问它。

  1. [root@k8s-master01 ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml -O dashboard.yaml
  2. [root@k8s-master01 ~]# vim dashboard.yaml
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. labels:
  7. k8s-app: kubernetes-dashboard
  8. name: kubernetes-dashboard
  9. namespace: kubernetes-dashboard
  10. spec:
  11. type: NodePort
  12. ports:
  13. - port: 443
  14. targetPort: 8443
  15. selector:
  16. k8s-app: kubernetes-dashboard
  17. [root@k8s-master01 ~]# kubectl apply -f dashboard.yaml
  18. namespace/kubernetes-dashboard created
  19. serviceaccount/kubernetes-dashboard created
  20. service/kubernetes-dashboard created
  21. secret/kubernetes-dashboard-certs created
  22. secret/kubernetes-dashboard-csrf created
  23. secret/kubernetes-dashboard-key-holder created
  24. configmap/kubernetes-dashboard-settings created
  25. role.rbac.authorization.k8s.io/kubernetes-dashboard created
  26. clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
  27. rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
  28. clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
  29. deployment.apps/kubernetes-dashboard created
  30. service/dashboard-metrics-scraper created
  31. deployment.apps/dashboard-metrics-scraper created
  32. [root@k8s-master01 ~]# kubectl get pod --namespace=kubernetes-dashboard
  33. NAME READY STATUS RESTARTS AGE
  34. dashboard-metrics-scraper-799d786dbf-xx9j7 1/1 Running 0 3m16s
  35. kubernetes-dashboard-fb8648fd9-rgc2z 1/1 Running 0 3m17s

2、访问到Dashboard

  1. [root@k8s-master01 ~]# kubectl get service --namespace=kubernetes-dashboard
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. dashboard-metrics-scraper ClusterIP 10.97.23.158 <none> 8000/TCP 4m6s
  4. kubernetes-dashboard NodePort 10.103.40.153 <none> 443:32358/TCP 4m7s
  5. [root@k8s-master01 ~]# netstat -lnupt |grep 32358
  6. tcp 0 0 0.0.0.0:32358 0.0.0.0:* LISTEN 41631/kube-proxy

浏览器输入:https://<任一节点主机IP>:/#/login

3、选择登录到Dashboard要使用的身份认证方式

登录进入Dashboard需要进行身份认证。

Dashboard服务在Pod中运行,Pod想要访问并获取到集群相关信息的话则需要创建一个ServiceAccount以验证身份。

Dashboard想要管理Kubernetes集群需要进行身份认证,目前支持Token和Kubeconfig两种方式。

Token:

创建一个拥有集群角色"cluster-admin"的服务账户"dashboard-admin",然后使用dashboard-admin的Token即可!当然你也可以根据特殊需要创建拥有指定权限的集群角色将其绑定到对应的服务账户上,以管理集群中指定资源。

  1. # 创建一个专用于Dashboard的服务账户"dashboard-admin"
  2. [root@k8s-master01 ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
  3. serviceaccount/dashboard-admin created
  4. # 为服务账户"dashboard-admin"绑定到拥有超级管理员权限的集群角色"cluster-admin"
  5. # 则dashboard-admin就拥有了超级管理员权限
  6. [root@k8s-master01 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
  7. clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
  8. # 创建的服务账户,会自动生成一个Token,它是Secret类型的资源对象
  9. # 我们可以使用以下操作获取到服务账户"dashboard-admin"的Token以用于Dashboard身份验证
  10. [root@k8s-master01 ~]# kubectl get secrets -n kubernetes-dashboard |grep dashboard-admin-token
  11. dashboard-admin-token-2bxfl kubernetes.io/service-account-token 3 66s
  12. [root@k8s-master01 ~]# kubectl describe secrets/dashboard-admin-token-2bxfl -n kubernetes-dashboard
  13. Name: dashboard-admin-token-2bxfl
  14. Namespace: kubernetes-dashboard
  15. Labels: <none>
  16. Annotations: kubernetes.io/service-account.name: dashboard-admin
  17. kubernetes.io/service-account.uid: 492a031e-db41-4a65-a8d4-af0e240e7f9d
  18. Type: kubernetes.io/service-account-token
  19. Data
  20. ====
  21. ca.crt: 1103 bytes
  22. namespace: 20 bytes
  23. token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImFXTzZFUElaS2RoTUpScHFwNzJSNUN5eU1lcFNSZEZqNWNNbi1VbFV2Zk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tMmJ4ZmwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDkyYTAzMWUtZGI0MS00YTY1LWE4ZDQtYWYwZTI0MGU3ZjlkIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.l5VEIPd9nIsJuXMh86rjFHhkIoZmg5nlDw7Bixn0b3-KT1r6o7WRegq8DJyVk_iiIfRnrrz5jjuOOkCKwXwvI1NCfVdsuBKXFwFZ1Crc-BwHjIxWbGuZfEGxSbN8du4T4xcUuNU-7HuZQcGDY23uy68aPqWSm8UoIcOFwUgVcYkKlOuW76tIXxG_upxWpWZz74aMDUIkjar7sdWXzMr1m5G43TLE9Z_lKCgoV-hc4Fo9_Er-TIAPqDG6-sfZZZ9Raldvn3j380QDYahUKaGKabnOFDXbODKOQ1VKRizgiRTOqt-z9YRPTcyxQzfheKC8DTb2X8D-E4x6azulenNgqw

Kubeconfig:

Token是很长的复杂的密钥字符串,使用它进行身份认证并不方便,所以Dashboard支持使用Kubeconfig文件的方式登陆到Dashboard。

基于上面Token的创建的服务账户,创建一个Kubeconfig配置文件。

  1. # 查看集群信息
  2. [root@k8s-master01 ~]# kubectl cluster-info
  3. Kubernetes control plane is running at https://192.168.124.100:9443
  4. # 创建kubeconfig文件并设置集群相关
  5. [root@k8s-master01 ~]# kubectl config set-cluster kubernetes --embed-certs=true --server="https://192.168.124.100:9443" --certificate-authority=/etc/kubernetes/pki/ca.crt --kubeconfig=dashboard-admin.kubeconfig
  6. # 设置认证相关到kubeconfig文件
  7. # 默认情况下服务账户的Token是base64编码格式,如果需要将其写到kubeconfig中的则需要使用"base64 -d"进行解
  8. # 码
  9. [root@k8s-master01 ~]# Token=$(kubectl get secrets/dashboard-admin-token-2bxfl -n kubernetes-dashboard -o jsonpath={.data.token} |base64 -d)
  10. [root@k8s-master01 ~]# kubectl config set-credentials dashboard-admin --token=${Token} --kubeconfig=./dashboard-admin.kubeconfig
  11. # 设置上下文相关到kubeconfig文件
  12. [root@k8s-master01 ~]# kubectl config set-context dashboard-admin --cluster=kubernetes --user=dashboard-admin --kubeconfig=./dashboard-admin.kubeconfig
  13. # 设置当前要使用的上下文到kubeconfig文件
  14. [root@k8s-master01 ~]# kubectl config use-context dashboard-admin --cluster=kubernetes --user=dashboard-admin --kubeconfig=./dashboard-admin.kubeconfig
  15. # 最后得到以下文件
  16. [root@k8s-master01 ~]# cat dashboard-admin.kubeconfig
  17. apiVersion: v1
  18. clusters:
  19. - cluster:
  20. certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQ0FYRFRJeU1EUXhNVEEwTXpnME1Gb1lEekl4TWpJd016RTRNRFF6T0RRd1dqQVZNUk13RVFZRApWUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCjR0RDRmU2ZmcHU1WS9KUGJrQWgvdG0xS1lSeWQ5YU9MVk9xTDQyc1M5YmxiZGh0WU9QSHYvWEpVb1k1ZSs5MXgKUE9NbnZnWmhiR29uditHQWVFazRKeUl4MTNiTm1XUk1DZ1QyYnJIWlhvcm5QeGE0ZlVsNHg5K2swVEc5ejdIMAo0cjF5MFkzWXNXaGJIeHBwL0hvQzNRR2JVWVJyMm03NVgxTWUvdFFCL25FcUNybUZxNkRveEU3REIxMkRnemE4CjBrM3FwZllGZHBOcnZBakdIcUlSZ0ZxT24ybDVkb0c3bGVhbkIrY2wxQWltUnZCMDdQdlVKdVhrK1N5NUhmdnMKNzYyYXJRYklNMUlISkJ0ZXBaQzVjYi9pNGZhcWNrTXJaeTZvanlnN2JPcjBuMlpQcHV5SnR5QjhLMnJDZCtYZApTeXlrZG44S0MxRlRSR0p6dkdpaVRRSURBUUFCbzFrd1Z6QU9CZ05WSFE4QkFmOEVCQU1DQXFRd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVucEhxdGJzZ01CcSt4Q1MzTVErWnk4akFpeFV3RlFZRFZSMFIKQkE0d0RJSUthM1ZpWlhKdVpYUmxjekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBRHhpR3c2bk5NV1hRMnVlRgppK2R2Nittc1FUT0JCWWJENkhIblVETUtnK0loaEcwclA5MkFRRjFWcUZaN1ZDSTgyWmJ5VnVWSmVvMjlkdjZpClBDeFJzWERxdHl0TG1CMkFPRUxXOFdqSCtheTZ5a3JYbGIwK1NIZ1Q3Q1NJRHhRdG9TeE8rK094WjhBb1JGMmUKTy94U1YxM0E0eG45RytmUEJETkVnWUJHbWd6L1RjSjZhYnljZnNNaGNwZ1kwKzJKZlJDemZBeFNiMld6TzBqaApucFRONUg2dG1ST3RlQ2h3anRWVDYrUXBUSzdkN0hjNmZlZ0w0S1pQZDEwZ0hyRFV1eWtpY01UNkpWNXNJSjArCmw5eWt2V1R2M2hEN0NJSmpJWnUySjdod0FGeW1hSmxzekZuZEpNZUFEL21pcDBMQk40OUdER2M2UFROdUw0WHEKeUxrYUhRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  21. server: https://192.168.124.100:9443
  22. name: kubernetes
  23. contexts:
  24. - context:
  25. cluster: kubernetes
  26. user: dashboard-admin
  27. name: dashboard-admin
  28. current-context: dashboard-admin
  29. kind: Config
  30. preferences: {}
  31. users:
  32. - name: dashboard-admin
  33. user:
  34. token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImFXTzZFUElaS2RoTUpScHFwNzJSNUN5eU1lcFNSZEZqNWNNbi1VbFV2Zk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tMmJ4ZmwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDkyYTAzMWUtZGI0MS00YTY1LWE4ZDQtYWYwZTI0MGU3ZjlkIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.l5VEIPd9nIsJuXMh86rjFHhkIoZmg5nlDw7Bixn0b3-KT1r6o7WRegq8DJyVk_iiIfRnrrz5jjuOOkCKwXwvI1NCfVdsuBKXFwFZ1Crc-BwHjIxWbGuZfEGxSbN8du4T4xcUuNU-7HuZQcGDY23uy68aPqWSm8UoIcOFwUgVcYkKlOuW76tIXxG_upxWpWZz74aMDUIkjar7sdWXzMr1m5G43TLE9Z_lKCgoV-hc4Fo9_Er-TIAPqDG6-sfZZZ9Raldvn3j380QDYahUKaGKabnOFDXbODKOQ1VKRizgiRTOqt-z9YRPTcyxQzfheKC8DTb2X8D-E4x6azulenNgqw

4、选择Kubeconfig文件登陆Dashboard即可



附录-查看Kubernetes与Docker兼容性

访问网址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md

附录-重置节点

当在使用"kubeadm init"或"kubeadm join"部署节点出现失败状况时,可以使用以下操作对节点进行重置!

注:重置会将节点恢复到未部署前状态,若集群已正常工作则无需重置,否则将引起不可恢复的集群故障!

  1. [root@k8s-master01 ~]# kubeadm reset -f
  2. [root@k8s-master01 ~]# ipvsadm --clear
  3. [root@k8s-master01 ~]# iptables -F && iptables -X && iptables -Z

附录-常用查看命令

更多的操作请完整学习Kubernetes的资源和集群管理!

查看令牌(Token)列表:

  1. [root@k8s-master01 ~]# kubeadm token list
  2. TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
  3. abcdef.0123456789abcdef <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
  4. ek6xtl.s3dk4vjxzp83bcx3 1h 2022-04-06T13:30:39Z <none> Proxy for managing TTL for the kubeadm-certs secret <none>

查看kubernetes集群中证书到期时间:

  1. [root@k8s-master01 ~]# kubeadm certs check-expiration
  2. [check-expiration] Reading configuration from the cluster...
  3. [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
  4. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  5. admin.conf Mar 18, 2122 04:02 UTC 99y no
  6. apiserver Mar 18, 2122 04:02 UTC 99y ca no
  7. apiserver-etcd-client Mar 18, 2122 04:02 UTC 99y etcd-ca no
  8. apiserver-kubelet-client Mar 18, 2122 04:02 UTC 99y ca no
  9. controller-manager.conf Mar 18, 2122 04:02 UTC 99y no
  10. etcd-healthcheck-client Mar 18, 2122 04:02 UTC 99y etcd-ca no
  11. etcd-peer Mar 18, 2122 04:02 UTC 99y etcd-ca no
  12. etcd-server Mar 18, 2122 04:02 UTC 99y etcd-ca no
  13. front-proxy-client Mar 18, 2122 04:02 UTC 99y front-proxy-ca no
  14. scheduler.conf Mar 18, 2122 04:02 UTC 99y no
  15. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  16. ca Mar 18, 2122 04:02 UTC 99y no
  17. etcd-ca Mar 18, 2122 04:02 UTC 99y no
  18. front-proxy-ca Mar 18, 2122 04:02 UTC 99y no

查看节点运行状态:

  1. [root@k8s-master01 ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master01 Ready control-plane,master 40h v1.23.0
  4. k8s-master02 Ready control-plane,master 40h v1.23.0
  5. k8s-master03 Ready control-plane,master 40h v1.23.0
  6. k8s-node01 Ready <none> 39h v1.23.0

查看Kubeadm初始化控制平面默认使用的配置信息:

  1. [root@k8s-master ~]# kubeadm config print init-defaults

查看Kubeadm部署安装Kubernetes集群所要使用的容器镜像列表:

  1. [root@k8s-master ~]# kubeadm config images list

查看集群中的名称空间(NameSpace):

  1. [root@k8s-master01 ~]# kubectl get namespace
  2. NAME STATUS AGE
  3. default Active 44h
  4. ingress-nginx Active 13h
  5. kube-node-lease Active 44h
  6. kube-public Active 44h
  7. kube-system Active 44h
  8. kubernetes-dashboard Active 7h7m

查看指定名称空间下Pod运行状态:

  1. [root@k8s-master01 ~]# kubectl get pod --namespace=kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. calico-kube-controllers-56fcbf9d6b-phf49 1/1 Running 0 16h
  4. calico-node-8frvw 1/1 Running 0 16h
  5. calico-node-mzpmv 1/1 Running 0 16h
  6. calico-node-rblcg 1/1 Running 0 16h
  7. calico-node-vh9c9 1/1 Running 0 16h
  8. coredns-6d8c4cb4d-85b5t 1/1 Running 0 16h
  9. coredns-6d8c4cb4d-h7ttw 1/1 Running 0 16h
  10. etcd-k8s-master01 1/1 Running 73 (19h ago) 44h
  11. etcd-k8s-master02 1/1 Running 51 (19h ago) 43h
  12. etcd-k8s-master03 1/1 Running 1 (24h ago) 43h
  13. ...

附录-新的Pod可以调度到Master节点上运行吗?

可以,默认情况下Master节点在创建的时候,就已经被填充了污点"taints",如果想要在Master节点上运行Pod,只需要将"taints"删除即可!(不建议的操作)

  1. [root@k8s-master01 ~]# kubectl describe nodes/k8s-master01
  2. Name: k8s-master01
  3. ...
  4. Taints: node-role.kubernetes.io/master:NoSchedule
  5. ...
  6. [root@k8s-master ~]# kubectl taint nodes --all node-role.kubernetes.io/master-

附录-集群最大支持多少个节点那?

参考文档:https://kubernetes.io/docs/setup/best-practices/cluster-large/

Kubernetes集群是由一组运行有Kubernetes代理的节点(物理机/虚拟机)组成,由控制平面节点管理着工作节点。

Kubernetes-v1.23.x理论上支持5000个节点的集群,其中:

  • 每个节点不超过110个Pod;
  • 集群中总的Pod数量不超过150000个;
  • 集群中总的容器数量不超过300000个。

以上数据仅是官方实践后得出的结论!

工作节点由一个或多个控制平面节点管理,控制平面节点可以管理工作节点的数量取决于控制平面节点所在物理主机的CPU、内存、磁盘IO和空间使用情况!那么这时候对主机以及相关组件做好监控是非常重要的!

其他人员的经验:

一台1核2GB的控制平面节点可以管理约5个工作节点!

一台32核120GB的控制平面节点可以管理约500个工作节点!

以上数据仅供参考!

使用Kubeadm搭建高可用Kubernetes集群的更多相关文章

  1. 搭建高可用kubernetes集群(keepalived+haproxy)

    序 由于单master节点的kubernetes集群,存在master节点异常之后无法继续使用的缺陷.本文参考网管流程搭建一套多master节点负载均衡的kubernetes集群.官网给出了两种拓扑结 ...

  2. 用kubeadm创建高可用kubernetes集群后,如何重新添加控制平面

    集群信息 集群版本:1.13.1 3个控制平面,2个worker节点 k8s-001:10.0.3.4 k8s-002:10.0.3.5 k8s-003:10.0.3.6 k8s-004:10.0.3 ...

  3. 搭建高可用mongodb集群(四)—— 分片(经典)

    转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...

  4. [转]搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  5. [转]搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  6. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  7. 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...

  8. 搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  9. 搭建高可用mongodb集群(一)——配置mongodb

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...

随机推荐

  1. Idea进行spring-boot-devtools热部署以及不生效的问题解决

    实现的方式有两种: spring-boot-devtools spring Loaded 我在此只介绍spring-boot-devtools的使用方法: 1.在pom中直接引入依赖 <depe ...

  2. Linux下编译安装配置MariaDB数据库

    说明:操作系统:CentOS 6.6  64位MariaDB版本:mariadb-5.5.33aMariaDB数据库存放目录:/data/mysql准备:一.配置防火墙,开启3306端口vi /etc ...

  3. sqli-labs下载与安装

    Sqli-labs 下载 Sqli-labs是一个印度程序员写的,用来学习sql注入的一个游戏教程. 博客地址为:http://dummy2dummies.blogspot.hk/, 博客当中有一些示 ...

  4. 使用postman进行post请求传递中文导致后台接收乱码的问题

    1.个人猜测估计是如果header里不指明编码的话,经过tomcat服务器时会导致转换乱码信息,这样就算你在filter里配置了EncodingFilter相关的过滤器也无济于事.. 解决方法就是在h ...

  5. JavaScript使用原型链实现继承

    JavaScript实现继承的思想: 一句话总结,让子类的原型等于父类的实例. 详细来说,其实利用了原型的性质即在JavaScript中所有被实例化对象具有相同的原型属性和方法,每一个被实例化对象的原 ...

  6. SynchronizedMap 和 ConcurrentHashMap 有什么区 别?

    SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来 访为 map. ConcurrentHashMap 使用分段锁来保证在多线程下的性能. ConcurrentHa ...

  7. 聊一聊Java8 Optional,让你的代码更加优雅

    码农在囧途 随着时间的推移,曾经我们觉得重要的东西,可能在今天看来是如此的浅薄和无知,同理,今天我们放不下,想不开,觉得重要的东西,多年后我们可能也会觉得也就那样,所以,今天的的所有烦恼,忧愁,想不开 ...

  8. 智能指针中C++重载'->'符号是怎么实现的

    例如下面的代码: class StrPtr{ public: StrPtr() : _ptr(nullptr){} //拷贝构造函数等省略... std::string* operator->( ...

  9. 一个html标签到底包含了多少信息(1)

    先来看一段代码: var dom = document.querySelector('body'); for(var i in dom){ console.log(i,dom[i]) } 可以看到很多 ...

  10. MEVN 架构(MongoDB + Express + Vue + NODEJS)搭建

    一个完整的网站服务架构包括:1.web frame ---这里应用express框架2.web server ---这里应用nodejs3.Database ---这里应用monggoDB4.前端展示 ...