kubeadm安装高可用k8s集群

1.1基本环境配置

准备5台具有2核cpu和4GB以上的服务器,系统为centos7.x

集群采用的服务器ip规划如下表所示。

主机名IP地址说明
k8s-master01192.168.196.135master01节点
k8s-master02192.168.196.136master02节点
k8s-master03192.168.196.137master03节点
k8s-node01192.168.196.138node01节点
k8s-node02192.168.196.139node02节点
VIP192.168.196.140keepalived虚拟ip

kubernetes一共涉及三个网段,一个是宿主机的网段,也就是上述的192.168.196.x,同时需要pod和service的网段,三者的网段不可交叉。

配置信息备注
系统版本centos7.9
Dcoker版本20.10.x
pod网段172.168.0.0
service网段10.96.0.0/12

注意:宿主机网段、k8s service网段、pod网段不能重复。

所有节点配置主机名(其他节点名称自行更改)

 [root@bogon ~]# hostnamectl set-hostname k8s-master01

所有节点配置hosts,修改/etc/hosts如下

 cat <<EOF >> /etc/hosts
 192.168.196.135 k8s-master01
 192.168.196.136 k8s-master02
 192.168.196.137 k8s-master03
 192.168.196.138 k8s-node01
 192.168.196.139 k8s-node02
 EOF

所有节点配置Docker、kubernetes和默认yum源

 [root@k8s-master01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 [root@k8s-master01 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

设置yum源

 [root@k8s-master01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

设置kubernetes.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

所有节点执行删除

 [root@k8s-master01 ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

所有节点安装一些常用的工具

 yum -y install wget jq psmisc vim* net-tools telnet git bash-com*

所有节点关闭防火墙、SELinux、DNSmasq

 systemctl disable --now firewalld
 systemctl disable --now dnsmasq
 systemctl disable --now NetworkManager
 setenforce 0
 sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
 sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

所有节点关闭swap分区

 swapoff -a && sysctl -w vm.swappiness=0
 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

所有节点安装ntpdate(如果服务器已经安装过了可以不安装,配置可以不修改)

 rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
 yum -y install ntpdate

所有节点同步时间

 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 echo 'Asia/Shanghai' > /etc/timezone
 ntpdate time2.aliyun.com
 ​

加入到crontab定时任务中 每五分钟执行一次

 [root@k8s-master01 ~]# crontab -e
 */5 * * * * /usr/sbin/ntpdate time2.aliyun.com

所有节点配置limit

linux下用ulimit设置连接数最大值,默认是1024. 在高负载下要设置为更高,但最高只能为65535.

 [root@k8s-node02 ~]# ulimit -SHn 65535
 ​
 将下边这些知道终端执行
 终极解除 Linux 系统的最大进程数和最大文件打开数限制:
 cat <<EOF >> /etc/security/limits.conf
 soft nofile 65536
 hard nofile 131072
 soft nproc 65535
 hard nproc 655350
 soft memlock unlimited
 hard memlock unlimited
 EOF

安装过程中,生成配置文件和证书均在master01节点上操作,所以master01节点需要免密要登陆其他节点,之后将文件传送到其他节点。

集群管理也在master01节点上操作(也可以是其他单独的节点)。配置密钥(只在master01节点管理节点操作,以下步骤将管理节点和master01节点统称为master01)

 [root@k8s-master01 ~]# ssh-keygen -t rsa

免密登录

 [root@k8s-master01 ~]# for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id  -i .ssh/id_rsa.pub $i;done

敲完命令回车后,输入yes,输入对应节点root的密码。

master01下载安装所有的源码文件

 [root@k8s-master01 ~]# cd /root/ ; git clone http://gitee.com/dukuan/k8s-ha-install.git

所有节点升级系统并重启

 yum -y update && reboot

1.2内核配置

为了集群的稳定性和兼容性,生产环境的内核最好升级到4.18版本以上,本实例将升级到4.19版本。

master01下载离线包:

 cd /root
 wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/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

将安装包从masetr01节点上传到其他节点

 [root@k8s-master01 ~]# for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done

所有节点安装内核

 cd /root && yum -y localinstall kernel-ml*

所有节点更改内核启动顺序

 grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg

[root@k8s-master02 ~]# grubby --args='user_namespace.enable=1' --update-kernel="$(grubby --default-kernel)"

所有节点检查内核是不是4.19

[root@k8s-master02 ~]# grubby --default-kernel

所有节点重启,然后再看是不是4.19

reboot
uname -a

·

所有节点安装ipvsadm和ipset

yum -y install ipvsadm ipset sysstat conntrack libseccomp

所有节点配置ipvs模块,在内核4.19+版本nf_conntrack_ipv4已经修改为nf_conntrack,4.18以下版本使用nf_conntrack_ipv4即可。

先用一节点修改好再传给其他节点

cat <<EOF> /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack	#4.18改成nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

使用master01节点将文件传到其他节点

[root@k8s-master01 ~]# for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp /etc/modules-load.d/ipvs.conf $i:/etc/modules-load.d/ ; done

所有节点重启这个服务

systemctl enable --now systemd-modules-load.service

开启一些k8s集群中必须的内核参数,所有节点配置k8s内核

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 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_bavklog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

所有节点加载系统任一个配置文件

sysctl --system

所有节点配置完内核后,重启服务器,保证重启后内核依旧加载

reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack

1.3组件和Runtime安装

本次主要安装的是集群中用到的各种组件,比如docker-ce、containerd、kubernetes组件等。准备了两种Runtime(运行时)的安装:Docker和Containerd,如果安装的版本高于1.24(社区计划在1.24版本废弃对dockershim的支持,具体可以通过kubernetes官方的ChangeLong进行确认),需要使用Containerd作为Kubernetes的Runtime。如果安装的版本低于1.24,选择Docker和Containerd均可。

注意:

如果安装的安装的版本高于1.24(包含1.24),需要选择Containerd作为Runtime;如果版本低于1.24,Runtime选择Docker和Containerd均可

1.3.1Containerd作为Runtime

所有节点安装docker-ce-20.10

yum -y install docker-ce-20.10.* docker-ce-cli-20.10.*

由于并不是每个节点都需要docker引擎,因此无需启动docker,只需要配置和启动containerd即可。

首先配置containerd需要的模块(所有节点)

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

所有节点加载模块

modprobe -- overlay
modprobe -- br_netfilter

所有节点配置containerd所需要的内核

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
neet.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
neet.bridge.bridge-nf-call-ip6tables = 1
EOF

所有节点加载内核

sysctl --system

所有节点配置containerd的配置文件

mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

所有节点将containerd的cgroup改成systemd。这里我是修改master01然后进行传给其他节点

vim /etc/containerd/config.toml

将 sandbox_image的pause镜像改成符合自己版本的地址 = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"

这里我用master01节点传到其他

for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp /etc/containerd/config.toml $i:/etc/containerd/ ; done

所有节点启动containerd,并配置开机自启动

systemctl daemon-reload
systemctl enable --now containerd

所有节点配置crictl客户端连接的Runtime位置

cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

1.3.2Docker作为Runtime

yum -y install docker-ce-19.03.*

建议使用

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

所有节点设置开机自启动docker

systemctl daemon-reload && systemctl enable --now docker

1.3.3 安装kubernetes组件

接下来安装kubernetes的系统组件

首先在master01节点查看最新的kubernetes版本是多少

[root@k8s-master01 ~]# yum list kubeadm.x86_64 --showduplicates | sort -r

这里看到最新版本是1.27.1-0,直接安装1.27.1-0即可,如果是生产环境,建议安装第三个版本号大于5的版本,比如1.23.5,如果没有1.23.5,只有1.23.3等,可以考虑使用1.22.5+等。

所有节点安装1.22最新版本的kubeadm、kubelet和kubectl

yum -y install kubeadm-1.22* kubelet-1.22* kubectl-1.22*

上面我选择的是containerd作为runtime,需要更改kubelet的配置,所有节点都进行

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_KUBEADM_ARGS="--network-plugin=cni --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix: ///run/containerd/containerd.sock --cgroup-driver=systemd"
EOF

所有节点设置kubelet开机自启动(由于还未初始化,没有kubelet的配置文件,此时kubelet无法启动,无需管理)

systemctl daemon-reload
systemctl enable --now kubelet

1.4 高可用组件安装

采用keepalived和haproxy实现高可用,所有需要安装keepalived和haproxy,keepalived和haproxy的节点可以和mastaer在同一个节点,也可以在不同的节点。

如果在公有云搭建高可用集群,可以采用公有云的负载均衡代替keepalived和haproxy。

如果想要搭建只有一个master节点的集群,可以不安装高可用组件。

所有master节点通过yum安装keepalived和haproxy

yum -y install keepalived haproxy

所有master节点配置haproxy(详细配可参考haproxy官方文档,所有master节点的haproxy配置相同)

mkdir /etc/haproxy

vim /etc/haproxy/haproxy.cfg
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s

defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s

frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor

frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master

backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server k8s-master01 192.168.196.135:6443 check
server k8s-master02 192.168.196.136:6443 check
server k8s-master03 192.168.196.137:6443 check

所有mastart节点配置keepalived,由于keepalived需要配置自身的ip地址和网卡名称,因此每个keepalived节点的配置不一样。

master01配置

mkdir /etc/keepalived




vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
        route_id LVS_DEVEL
script_user root
        enable_script_security
}
vrrp_script chk_apiserver {
        script "/etc/keepalived/check_apiserver.sh"
        interval 5
        weight -5
        fall 2
rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    mcast_src_ip 192.168.196.135
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.196.140
    }
        track_script {
                chk_apiserver
}
}

master02配置

mkdir /etc/keepalived




vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
        route_id LVS_DEVEL
script_user root
        enable_script_security
}
vrrp_script chk_apiserver {
        script "/etc/keepalived/check_apiserver.sh"
        interval 5
        weight -5
        fall 2
rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    mcast_src_ip 192.168.196.136
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.196.140
    }
        track_script {
                chk_apiserver
}
}

master03节点配置

mkdir /etc/keepalived




vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
        route_id LVS_DEVEL
script_user root
        enable_script_security
}
vrrp_script chk_apiserver {
        script "/etc/keepalived/check_apiserver.sh"
        interval 5
        weight -5
        fall 2
rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    mcast_src_ip 192.168.196.137
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.196.140
    }
        track_script {
                chk_apiserver
}
}

所有master节点配置keepalived健康检查文件

vim /etc/keepalived/check_apiserver.sh
#!/bin/bash

err=0
for k in $(seq 1 3)
do
        check_code=$(pgrep haproxy)
        if [[  $check_code == "" ]]; then
                err=$(expr $err + 1)
                sleep 1
                continue
        else
                err=0
                break
        fi
done

if [[  $err != "0" ]]; then
        echo "systemctl stop keepalived"
        /usr/bin/systemctl stop keepalived
        exit 1
else
        exit 0
fi

添加执行权限

chmod +x /etc/keepalived/check_apiserver.sh

启动haproxy和keepalived

systemctl daemon-reload
systemctl enable --now haproxy
systemctl enable --now keepalived

如果是用haproxy和keepalived实现的高可用,则需要测试VIP是否正常的

所有节点进行ping测试

ping 192.168.196.140 -c 4

192.168.196.140 是vip,根据自己配置的ping

所有节点进行teinet测试

telnet 192.168.196.140 16443

如果ping不同且teinet没有出现,则认为VIP不可用。如果vip不可用,不可继续往下执行,需要排查vip的问题,比如防火墙和SELinux、HAProxy和Keepalived状态,监听端口是否正常等。

1.5 集群初始化

使用kubeadm安装集群时,需要一个master节点初始化集群,然后加入其他节点即可,初始化集群时,可以直接使用kubeadm命令进行初始化,也可以使用一个配置文件进行初始化,由于使用命令行的形式可能需要配置的字段比较多,因此本实例采用配置文件进行初始化。

注意:

首先创建的是kubeadm配置文件,宿主机网段、podsubnet网段、servicesubnet网段不能重复:其次,kubernetesVersion的值改为和自己环境kubeadm版本一致,可以通过kubeadm version命令查询:最后,如果不是高可用集群,controipianeEndpoint需要改为master节点的ip和6443端口,certSANs也需要改为master节点ip。

Master01节点创建kubeadm-config.yaml配置文件

[root@k8s-master01 ~]# kubeadm config print init-defaults > kubeadm-config.yaml

master01节点编辑配置文件

[root@k8s-master01 ~]# vim kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.196.135
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master01
  taints:
  - effect : NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - 192.168.196.140
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.196.140:16443
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.22.17
networking:
  dnsDomain: cluster.local
  podSubnet: 172.168.0.0/12
  serviceSubnet: 10.96.0.0/12
scheduler: {}

更新以下kubeadm配置文件(master01节点操作)

[root@k8s-master01 ~]# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

使用master01节点将new.ymal文件推到masetr02和03

[root@k8s-master01 ~]# for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done

所有master节点提前下载镜像,可以节省初始化时间(其他节点不需要更改任何配置,包括ip地址也不需要修改)

kubeadm config images pull --config /root/new.yaml

若果这里报错,说明DNS没有解析那就去配置以下网卡的DNS,这里就把所有节点都加上。

vim /etc/sysconfig/network-scripts/ifcfg-ens33

DNS1=8.8.8.8
DNS2=192.168.196.2

然后重启网卡
systemctl restart network

初始化master01节点 初始化后会在/etc/kubernetes目录下生成对应的证书和配置文件,之后其他其他master节点加入master01即可

[root@k8s-master01 ~]# kubeadm init --config /root/new.yaml --upload-certs

如果初始化报错,可能是缺失/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,5个节点都添加,省的后面报错还要回来弄

[root@k8s-master01 ~]# mkdir -p /etc/systemd/system/kubelet.service.d/
[root@k8s-master01 ~]# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf



# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

再将报错时配置的删除

[root@k8s-master01 ~]# rm -rf /etc/cni/net.d
[root@k8s-master01 ~]# rm -rf $HOME/.kube/config
[root@k8s-master01 ~]# rm -rf /etc/kubernetes/

再次初始化

[root@k8s-master01 ~]# kubeadm init --config /root/new.yaml --upload-certs

初始化完成以后,会产生Token值,用于其他节点假如时使用,因此要记录一下初始化公共生成的token值(令牌值)。

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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:

  kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac \
        --control-plane --certificate-key efe2932d4f2a888af1445de649f3cb3d1d87e05ab908d33e682e1d00d863038c

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:

kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac

初始化后会在/etc/kubernetes目录下生成对应的证书和配置文件,之后其他其他master节点加入master01即可

[root@k8s-master01 ~]# cd /etc/kubernetes

其他master节点通过如下命令加入集群 02节点和03节点操作

  kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac \
        --control-plane --certificate-key efe2932d4f2a888af1445de649f3cb3d1d87e05ab908d33e682e1d00d863038c

node节点通过命令加入集群

kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac

通过命令kubectl get nodes查看集群

kubectl get nodes

如果报错

The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决方法: 1.将主节点(master)中的“/etc/kubernetes/admin.conf”文件拷贝到从节点相同目录下

[root@k8s-master01 ~]# for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02; do scp /etc/kubernetes/admin.conf $i:/etc/kubernetes/; done

2.配置环境变量

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

3.立即生效

source ~/.bash_profile

4.查看kubelet运行状态,显示正常运行。

systemctl status kubelet

通过命令kubectl get nodes查看集群

[root@k8s-master01 ~]# kubectl get nodes

初始化成功后,Master01节点配置KUBECONFIG环境变量,之后Kubectl即可访问kubernets集群

cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

立即生效环境变量配置文件

[root@k8s-master01 ~]# source /root/.bashrc

查看节点状态

[root@k8s-master01 ~]# kubectl get node

采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看pod状态

[root@k8s-master01 ~]# kubectl get pod -n kube-system

上面已经添加了集群,1.6和1.7步骤不用做。

1.6 Master实现高可用

其他master节点和node节点加入集群,方法是一致的,只不过master节点加入集群是需要指定--control-plane和--certificate-key参数。将master02和master03加入集群,两个节点分别执行

  kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac \
        --control-plane --certificate-key efe2932d4f2a888af1445de649f3cb3d1d87e05ab908d33e682e1d00d863038c

3个master节点加入后,可以查看此时的节点状态

[root@k8s-master01 ~]# kubectl get node

1.7 Node节点的配置

Node节点(也称为工作节点、Worker节点)上主要部署公司的一些应用业务,生产环境中不建议Master节点部署系统组件之外的其他pod,测试环境可以允许master节点部署pod以节省系统资源。node节点加入集群和master的区别是没有--control-plane和--certificate-key参数。将node01和node02加入集群,两个节点分别执行

kubeadm join 192.168.196.140:16443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac

所有节点初始化完成后,查看集群状态

[root@k8s-master01 ~]# kubectl get node

注意:

所有节点加入后,节点的STATUS字段为NOtReady,由于版本不同,显示的结果可能不同,如果是NOtReady,安装完CNI杰克变成Ready状态。

1.8 Token过期处理

默认情况下,新建的集群Token有效期是24小时,如果过期的话,需要重新生成Token,此时可以使用如下命令生成

在master01操作

[root@k8s-master01 ~]# kubeadm token create --print-join-command
kubeadm join 192.168.196.140:16443 --token 5tzly6.lcmirygq0p816p5z --discovery-token-ca-cert-hash sha256:7a16c396e8a10f8a97588f178b628102f8635925f821be4cfcf4b437d12e6dac

如果需要添加Master,certificate-key也需要重新生成

[root@k8s-master01 ~]# kubeadm init phase upload-certs --upload-certs
I0502 16:52:17.433644   50068 version.go:255] remote version is much newer: v1.27.1; falling back to: stable-1.22
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
439882ae14270d6137417fc6d7a40283a21c5b8cb7d2f091ab49dbee22cbe9b5

1.9 Calico组件的安装

接下来安装CNI插件,CNI插件可以选择

[root@k8s-master01 k8s-ha-install]# cd /root/k8s-ha-install && git checkout manual-installation-v1.22.x && cd calico/

修改pod网段为自己配置的pod网段

[root@k8s-master01 calico]# POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

替换calico.yaml

[root@k8s-master01 calico]# sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml

[root@k8s-master01 calico]# kubectl apply -f calico.yaml

创建完成后查看容器和节点状态

[root@k8s-master01 calico]# kubectl get pod -n kube-system

查询到Error不用管,过几分钟在查询就正常了

此时节点状态正常

[root@k8s-master01 calico]# kubectl get node

1.10 Metrics部署

在新版的kubernetes中,系统资源的采集使用Metrics-server,可以通过Metrics采集节点和pod的内存、磁盘、cpu和网络的使用率。

将master01节点的front-proxy-ca.crt复制到所有node节点上

[root@k8s-master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crt
[root@k8s-master01 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crt

在master01节点安装metrics server

[root@k8s-master01 ~]# cd /root/k8s-ha-install/kubeadm-metrics-server
[root@k8s-master01 kubeadm-metrics-server]# kubectl create -f comp.yaml

查看metrics-server Pod状态

[root@k8s-master01 kubeadm-metrics-server]# kubectl get po -n kube-system

待pod变成1/1Running后,等待几分钟,即可查看节点和pod资源的使用率

kubectl top node
kubectl top po -A

1.11 Dashboard部署

kubernetes官方提供了简单的图形化展示,用于展示集群中的各类资源,同时也可以通过Dashboard实时查看pod的日志和在容器中执行一些命令等。

1.11.1 安装Dashboard

在master01节点创建Dashboard(该命令包含管理员用户的创建)

[root@k8s-master01 kubeadm-metrics-server]# cd /root/k8s-ha-install/dashboard/
[root@k8s-master01 dashboard]# kubectl create -f .

1.11.2 登录Dashboard

由于Dashboard采用的自签名证书无法通过谷歌浏览器访问,可以用火狐浏览器进行访问。

根据查到的端口号,通过任意安装的kube-proxy的宿主机的ip+端口号即可访问Dashboard

访问Dashboard 注意这里是自己查到的端口号,下面有查看端口号的命令

https://192.168.196.140:32050/

查看端口号

[root@k8s-master01 dashboard]# kubectl get svc kubernetes-dashboard -n kubernetes-dashboard

查看登陆的Token值

[root@k8s-master01 dashboard]# kubectl -n kube-system describe secret $(kube-system get secret | grep admin-user | awk '{print $1}')

【必看】注意事项

将Kube-proxy改为ipvs模式,因为在初始化集群的时候注释了ipvs配置,所以需要自行修改一下: 在master01节点执行

kubectl edit cm kube-proxy -n kube-system

更新Kube-Proxy的Pod:

[root@k8s-master01 ~]# kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system

验证Kube-Proxy模式

[root@k8s-master01 ~]# curl 127.0.0.1:10249/proxyMode

注意:kubeadm安装的集群,证书有效期默认是一年。master节点的kube-apiserver、kube-scheduler、kube-controller-manager、etcd都是以容器运行的。可以通过kubectl get po -n kube-system查看。 启动和二进制不同的是, kubelet的配置文件在/etc/sysconfig/kubelet和/var/lib/kubelet/config.yaml,修改后需要重启kubelet进程 其他组件的配置文件在/etc/kubernetes/manifests目录下,比如kube-apiserver.yaml,该yaml文件更改后,kubelet会自动刷新配置,也就是会重启pod。不能再次创建该文件 kube-proxy的配置在kube-system命名空间下的configmap中,可以通过 kubectl edit cm kube-proxy -n kube-system进行更改

污点方面

[root@k8s-master01 ~]# kubectl describe node -l node-role.kubernetes.io/master= | grep -B 3 Taints

删除污点

kubectl taint node -l node-role.kubernetes.io/master node-role.kubernetes.io/

kubectl describe node -l node-role.kubernetes.io/master= | grep Taints

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值