1.1基本环境配置
准备5台具有2核cpu和4GB以上的服务器,系统为centos7.x
集群采用的服务器ip规划如下表所示。
主机名 | IP地址 | 说明 |
---|---|---|
k8s-master01 | 192.168.196.135 | master01节点 |
k8s-master02 | 192.168.196.136 | master02节点 |
k8s-master03 | 192.168.196.137 | master03节点 |
k8s-node01 | 192.168.196.138 | node01节点 |
k8s-node02 | 192.168.196.139 | node02节点 |
VIP | 192.168.196.140 | keepalived虚拟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 <> /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 </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 <> /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 </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 </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 <所有节点加载模块
modprobe -- overlay modprobe -- br_netfilter所有节点配置containerd所需要的内核
cat <所有节点加载内核
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 <1.3.2Docker作为Runtime
yum -y install docker-ce-19.03.*建议使用
mkdir /etc/docker cat > /etc/docker/daemon.json <所有节点设置开机自启动docker
systemctl daemon-reload && systemctl enable --now docker1.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<所有节点设置kubelet开机自启动(由于还未初始化,没有kubelet的配置文件,此时kubelet无法启动,无需管理)
systemctl daemon-reload systemctl enable --now kubelet1.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 4192.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.yamlmaster01节点编辑配置文件
[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 efe2932d4f2a888af1445de649f3cb3d1d87e05ab908d33e682e1d00d863038cnode节点通过命令加入集群
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/; done2.配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile3.立即生效
source ~/.bash_profile4.查看kubelet运行状态,显示正常运行。
systemctl status kubelet通过命令kubectl get nodes查看集群
[root@k8s-master01 ~]# kubectl get nodes初始化成功后,Master01节点配置KUBECONFIG环境变量,之后Kubectl即可访问kubernets集群
cat <> /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 efe2932d4f2a888af1445de649f3cb3d1d87e05ab908d33e682e1d00d863038c3个master节点加入后,可以查看此时的节点状态
[root@k8s-master01 ~]# kubectl get node1.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: 439882ae14270d6137417fc6d7a40283a21c5b8cb7d2f091ab49dbee22cbe9b51.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 node1.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 nodekubectl top po -A1.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