目录
初始化安装k8s集群的实验环境
将机器的IP更改为静态IP。
如果我关闭selinux,所有k8s 机器都可以工作
配置机器主机名
配置hosts文件以使用主机名相互访问。
配置主机间无密码登录
关闭交换分区以提高性能
关闭防火墙防火墙
配置阿里云仓库源
配置安装k8s组件所需的阿里云仓库源
安装基础包
安装Containerd服务
安装容器
安装初始化k8s所需的软件包。
kubeadm 初始化k8s 集群
扩展您的k8s 集群- 添加您的第一个工作节点
安装Kubernetes 网络组件- Calico
calico网络插件配置文件说明
测试使用k8s创建的Pod是否可以正常访问网络
CTR 和CRICTL 之间的区别
扩展您的k8s 集群并添加第二个工作节点
扩容k8s集群并添加第二个控制节点
作者:韩胜超老师
ps: 国内很多镜像站点都已经关闭,所以如果你想使用海外镜像源来代替,就需要一个神奇的网络环境。由于直接复制粘贴文档中的YAML文件配置可能会导致格式错误,因此将实验所需的YAML文件和本地包打包在网盘链接:https://pan.baidu.com /s/11NM-WkI7KCza68GY_-8OQw
提取码:mew.
规划k8s环境:
podSubnet(pod网段)10.244.0.0/16
serviceSubnet(业务网段): 10.96.0.0/12
规划实验环境:
操作系统:centos7.9
配置:4Gib内存/4vCPU/60G硬盘
网络:NAT模式
K8S集群角色
知识产权
CPU名称
安装的组件
控制节点
192.168.40.180
闲潮大师1
apiserver、控制器管理器、调度、kubelet、etcd、kube-proxy、容器运行时、calico
工作节点
192.168.40.181
先潮节点1
Kube 代理、calico、coredns、容器运行时、kubelet
初始化安装k8s集群的实验环境
修改机器IP,变成静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件
类型=以太网
PROXY_METHOD=无
BROWSER_ONLY=否
BOOTPROTO=静态
IPADDR=192.168.40.180
网络掩码=255.255.255.0
网关=192.168.40.2
DNS1=192.168.40.2
去浮=是
IPV4_FAILURE_FATAL=否
IPV6INIT=是
IPV6_AUTOCONF=是
IPV6_DEFROUTE=是
IPV6_FAILURE_FATAL=否
IPV6_ADDR_GEN_MODE=稳定的隐私
名称=ens33
设备=ens33
开机=是
#更改配置文件后,必须重新启动网络服务才能使配置生效。重启网络服务的命令是:
服务网络重启
注意:配置/etc/sysconfig/network-scripts/ifcfg-ens33 文件的步骤:
NAME=ens33 #网卡名称。确保它与设备名称匹配。
DEVICE=ens33 #网卡设备名称。 ip addr 显示您的网卡设备名称。每台机器的名称可能不同,因此您必须编写自己的名称。
BOOTPROTO=static #static表示静态IP地址
ONBOOT=yes #开机后自动启动网络。一定是的
IPADDR=192.168.40.180 #ip地址。它必须与您的计算机所在的网段匹配。
NETMASK=255.255.255.0 #子网掩码。它必须与您的计算机所在的网段匹配。
GATEWAY=192.168.1.2 #网关,在电脑上打开cmd输入ipconfig /all确认。
DNS1=192.168.1.2 #DNS,在电脑上打开cmd输入ipconfig /all查看。
每个节点运行以下命令来更新yum 源和操作系统。
百胜更新-y
在每台机器上安装基础包。
yum install -y 设备映射器持久数据lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-develcurlcurl-devel 解压sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib -devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
关闭selinux,所有k8s机器均操作
sed -i \’s/SELINUX=enforcing/SELINUX=disabled/g\’ /etc/selinux/config
修改#selinux配置文件后,重启机器使selinux配置永久生效,登录机器,执行以下命令:
获得力量
如果显示#Disabled,则selinux已经终止。
配置机器主机名
在192.168.40.180 上运行:
hostnamectl set-主机名xianchaomaster1 bash
在192.168.40.181 上运行:
hostnamectl set-主机名xianchaonode1 bash
配置主机hosts文件,相互之间通过主机名互相访问
修改每台机器上的/etc/hosts文件,在文件末尾添加以下内容:
192.168.40.180 闲潮大师1
192.168.40.181xianchaonode1
修改后的文件为:
127.0.0.1 本地主机本地主机.本地域本地主机4 本地主机4.本地域4
:1 本地主机本地主机.本地域本地主机6 本地主机6.本地域6
192.168.40.180 闲潮大师1
192.168.40.181xianchaonode1
配置主机之间无密码登录
配置xinchaimaster1免密码登录其他机器
[root@xianchaomaster1 ~]# ssh-keygen #一路按回车,无需输入密码
将本地生成的密钥文件和私钥文件复制到远程主机。
[root@xianchaomaster1 ~]# ssh-copy-id xianchaonode1
关闭交换分区swap,提升性能
#永久关闭:注释交换挂载,将注释添加到交换行的开头
[root@xianchaomaster1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap 交换交换默认0 0
[root@xianchaonode1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap 交换交换默认0 0
问题1:为什么要关闭交换分区?
当您的计算机内存不足时,将使用交换。但是,由于交换分区可提供更好的性能,因此默认情况下交换分区不可用。 Kubeadm初始化时会检测swap是否关闭。如果不关闭,初始化将会失败。如果您不想关闭交换分区,请在安装k8s 时指定–ignore-preflight-errors=Swap 来解决问题。
修改机器内核参数
[root@xinchaomaster1 ~]# modprobe br_netfilter
[root@xianchaomaster1 ~]# cat /etc/sysctl.d/k8s.conf EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
结束后
[root@xianchaomaster1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@xianchaonode1~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@xianchaonode1 ~]# modprobe br_netfilter
[root@xianchaonode1~]# cat /etc/sysctl.d/k8s.conf EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
结束后
[root@xianchaonode1~]# sysctl -p /etc/sysctl.d/k8s.conf
问题1:sysctl 是做什么的?
在运行时设置内核参数
-p 从指定文件加载系统参数。如果未指定,将从/etc/sysctl.conf加载。
问题2:为什么需要运行modprobe br_netfilter?
修改/etc/sysctl.d/k8s.conf文件,添加以下三行参数:
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.d/k8s.conf 报告错误。
sysctl: 无法统计/proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有这样的文件或目录
sysctl: 无法统计/proc/sys/net/bridge/bridge-nf-call-iptables: 没有这样的文件或目录
解决了:
modprobe br_netfilter
问题3:为什么要启用net.bridge.bridge-nf-call-iptables 内核参数?
在centos上安装docker时,运行docker info会显示以下警告:
警告: Bridge-nf-call-iptables 已禁用
警告: Bridge-nf-call-ip6tables 已禁用
解决了:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
问题4:为什么需要启用net.ipv4.ip_forward=1参数?
kubeadm初始化k8s时报错。
这意味着ip_forward 未启用且必须启用。
net.ipv4.ip_forward是数据包转发。
出于安全考虑,Linux系统默认禁止数据包的传输。所谓转发是指如果主机有多个网卡,其中一个网卡接收到数据包后,根据数据包的目的IP地址将其发送到本机的另一块网卡上。该卡根据路由表继续发送数据包。通常这是路由器应该做的。
要在Linux 系统上启用路由和转发功能,必须设置Linux 内核参数net.ipv4.ip_forward。该参数指定Linux系统上当前对路由和转发功能的支持。值为0 表示禁止IP 转发,值为1 表示打开IP 转发功能。
关闭firewalld防火墙
[root@xianchaomaster1 ~]# systemctl 停止防火墙。 systemctl 禁用防火墙。
[root@xianchaonode1 ~]# systemctl 停止防火墙。 systemctl 禁用防火墙。
配置阿里云的repo源
#设置阿里云仓库源,在国内安装docker和containerd
[root@xianchaomaster1 ~]#yum install yum-utils -y
[root@xianchaonode1 ~]#yum install yum-utils -y
[root@xiaochaomaster1 ~]# yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@xianchaonode1 ~]# yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置安装k8s组件需要的阿里云的repo源
[root@xianchaomaster1 ~]#cat /etc/yum.repos.d/kubernetes.repo EOF
[库伯内特]
名称=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
有效=1
gpg检查=0
结束后
[root@xianchaonode1 ~]#cat /etc/yum.repos.d/kubernetes.repo EOF
[库伯内特]
名称=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
有效=1
gpg检查=0
结束后
配置时间同步
在xianchaimaster1 上运行:
#安装ntpdate命令
[root@xianchaomaster1 ~]# yum install ntpdate -y
#与网络时间同步
[root@xianchaomaster1 ~]# ntpdate cn.pool.ntp.org
#定时任务添加时间同步
[root@xinchaomaster1 ~]# crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启crond服务
[root@xianchaomaster1 ~]#重启服务crond
在xinchaonode1 上运行:
#安装ntpdate命令
[root@xianchaonode1 ~]# yum install ntpdate -y
#与网络时间同步
[root@xianchaonode1 ~]#ntpdate cn.pool.ntp.org
#定时任务添加时间同步
[root@xinchaonode1 ~]#crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启crond服务
[root@xinchaonode1 ~]#重启服务crond
安装基础软件包
[root@xianchaomaster1 ~]# yum install -y 设备映射器持久数据lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-develcurlcurl-devel unzip sudo ntp libaio-devel wget vim ncurses -devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
[root@xianchaonode1 ~]# yum install -y 设备映射器持久数据lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-develcurlcurl-devel unzip sudo ntp libaio-devel wget vim ncurses -devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
安装containerd服务
安装containerd,k8s从1.24开始使用containerd作为容器运行时。
[root@xianchaomaster1 ~]#yuminstallcontainerd.io-1.6.6 -y
接下来,生成containerd配置文件:
[root@xianchaomaster1 ~]#mkdir -p /etc/containerd
[root@xianchaomaster1 ~]#containerd 配置默认/etc/containerd/config.toml
修改配置文件。
打开/etc/containerd/config.toml
将SystemdCgroup=false 更改为SystemdCgroup=true。
将sandbox_image=\’k8s.gcr.io/pause:3.6\’ 更改为sandbox_image=\’registry.aliyuncs.com/google_containers/pause:3.7\’。
配置containerd在启动时启动并启动containerd。
[root@xiaochaomaster1 ~]#启用systemctl容器–now
[root@xianchaonode1 ~]#yuminstallcontainerd.io-1.6.6 -y
接下来,生成containerd配置文件:
[root@xianchaonode1 ~]#mkdir -p /etc/containerd
[root@xianchaonode1 ~]#containerd 配置默认/etc/containerd/config.toml
修改配置文件。
打开/etc/containerd/config.toml
将SystemdCgroup=false 更改为SystemdCgroup=true。
将sandbox_image=\’k8s.gcr.io/pause:3.6\’ 更改为sandbox_image=\’registry.aliyuncs.com/google_containers/pause:3.7\’。
配置containerd在启动时启动并启动containerd。
[root@xianchaonode1 ~]#启用systemctl容器–now
修改配置文件。
打开/etc/containerd/config.toml
将SystemdCgroup=false 更改为SystemdCgroup=true。
将sandbox_image=\’k8s.gcr.io/pause:3.6\’ 更改为sandbox_image=\’registry.aliyuncs.com/google_containers/pause:3.7\’。
将containerd配置为在引导时启动并启动containerd。
[root@xianchaonode2 ~]#启用systemctl容器–now
修改/etc/crictl.yaml文件。
[root@xianchaomaster1 ~]#cat /etc/crictl.yaml EOF
运行时端点: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
超时: 10
调试: 错误
结束后
[root@xiaochaomaster1 ~]#systemctl 重启容器
[root@xianchaonode1 ~]#cat /etc/crictl.yaml EOF
运行时端点: unix:///run/containerd/containerd.sock
图像内窥镜
oint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@xianchaonode1 ~]#systemctl restart containerd
配置containerd镜像加速器,k8s所有节点均按照以下配置:
编辑vim /etc/containerd/config.toml文件
找到config_path = \”\”,修改成如下目录:
config_path = \”/etc/containerd/certs.d\”
#保存退出
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host.\”https://vh3bm52y.mirror.aliyuncs.com\”,host.\”https://registry.docker-cn.com\”]
capabilities = [\”pull\”]
重启containerd:
systemctl restart containerd
备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
[root@xianchaomaster1 ~]#yum install docker-ce -y
[root@xianchaonode1 ~]#yum install docker-ce -y
[root@xianchaomaster1 ~]#systemctl enable docker –now
[root@xianchaonode1 ~]#systemctl enable docker –now
配置docker镜像加速器,k8s所有节点均按照以下配置
vim /etc/docker/daemon.json
写入如下内容:
{
\”registry-mirrors\”:[\”https://vh3bm52y.mirror.aliyuncs.com\”,\”https://registry.docker-cn.com\”,\”https://docker.mirrors.ustc.edu.cn\”,\”https://dockerhub.azk8s.cn\”,\”http://hub-mirror.c.163.com\”]
}
重启docker:
systemctl restart docker
安装初始化k8s需要的软件包
[root@xianchaomaster1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xianchaomaster1 ~]# systemctl enable kubelet
[root@xianchaonode1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xianchaonode1 ~]# systemctl enable kubelet
注:每个软件包的作用
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
kubeadm初始化k8s集群
#设置容器运行时
[root@xianchaomaster1~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
[root@xianchaonode1~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
#使用kubeadm初始化k8s集群
[root@xianchaomaster1 ~]# kubeadm config print init-defaults > kubeadm.yaml
根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd
kubeadm.yaml配置文件如下:
apiVersion: kubeadm.k8s.io/v1beta3
。。。
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.40.180 #控制节点的ip
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock #指定containerd容器运行时
imagePullPolicy: IfNotPresent
name: xianchaomaster1 #控制节点主机名
taints: null
—
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# 指定阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.26.0 #k8s版本
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个
serviceSubnet: 10.96.0.0/12 #指定Service网段
scheduler: {}
#在文件最后,插入以下内容,(复制时,要带着—):
—
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
—
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
#基于kubeadm.yaml初始化k8s集群
[root@xianchaomaster1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xianchaonode1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
备注:k8s_1.26.0.tar.gz这个文件如何来的?
这个文件把安装k8s需要的镜像都集成好了,这个是我第一次安装1.26.0这个版本,获取到对应的镜像,通过ctr images export 这个命令把镜像输出到k8s_1.26.0.tar.gz文件,如果大家安装其他版本,那就不需要实现解压镜像,可以默认从网络拉取镜像即可。
ctr是containerd自带的工具,有命名空间的概念,若是k8s相关的镜像,都默认在k8s.io这个命名空间,所以导入镜像时需要指定命令空间为k8s.io
#使用ctr命令指定命名空间导入镜像
ctr -n=k8s.io images import k8s_1.26.0.tar.gz
#查看镜像,可以看到可以查询到了
crictl images
[root@xianchaomaster1 ~]# kubeadm init –config=kubeadm.yaml –ignore-preflight-errors=SystemVerification
显示如下,说明安装完成:
特别提醒:–image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8s.gcr.io拉取镜像。 我们本地有导入到的离线镜像,所以会优先使用本地的镜像。
mode: ipvs 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式,如下:
#配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理
[root@xianchaomaster1 ~]# mkdir -p $HOME/.kube
[root@xianchaomaster1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@xianchaomaster1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 NotReady control-plane 2m25s v1.26.0
扩容k8s集群-添加第一个工作节点
在xianchaomaster1上查看加入节点的命令:
[root@xianchaomaster1 ~]# kubeadm token create –print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 –token vulvta.9ns7da3saibv4pg1 –discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
把xianchaonode1加入k8s集群:
[root@xianchaonode1~]# kubeadm join 192.168.40.180:6443 –token vulvta.9ns7da3saibv4pg1 –discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a –ignore-preflight-errors=SystemVerification
#看到上面说明xianchaonode1节点已经加入到集群了,充当工作节点
#在xianchaomaster1上查看集群节点状况:
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 Ready control-plane,master 49m v1.26.0
xianchaonode1 Ready <none> 39s v1.26.0
#可以对xianchaonode1打个标签,显示work
[root@xianchaomaster1 ~]# kubectl label nodes xianchaonode1 node-role.kubernetes.io/work=work
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 NotReady control-plane 10m v1.26.0
xianchaonode1 NotReady work 27s v1.26.0
安装kubernetes网络组件-Calico
把安装calico需要的镜像calico.tar.gz传到xianchaomaster1和xianchaonode1节点,手动解压:
[root@xianchaomaster1 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@xianchaonode1 ~]# ctr -n=k8s.io images import calico.tar.gz
上传calico.yaml到xianchaomaster1上,使用yaml文件安装calico 网络插件 。
[root@xianchaomaster1 ~]# kubectl apply -f calico.yaml
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml
。
[root@xianchaomaster1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
xianchaomaster1 Ready control-plane 36m v1.26.0
xianchaonode1 Ready work 21m v1.26.0
calico网络插件配置文件说明
1、Daemonset配置
……
containers:
# Runs calico-node container on each Kubernetes node. This
# container programs network policy and routes on each
# host.
– name: calico-node
image: docker.io/calico/node:v3.18.0
……
env:
# Use Kubernetes API as the backing datastore.
– name: DATASTORE_TYPE
value: \”kubernetes\”
# Cluster type to identify the deployment type
– name: CLUSTER_TYPE
value: \”k8s,bgp\”
# Auto-detect the BGP IP address.
– name: IP
value: \”autodetect\”
#pod网段
– name: CALICO_IPV4POOL_CIDR
value: \”10.244.0.0/16\”
# Enable IPIP
– name: CALICO_IPV4POOL_IPIP
value: \”Always\”
IP_AUTODETECTION_METHOD:获取Node IP地址的方式,默认使用第1个网络接口的IP地址,对于安装了多块网卡的Node,可以使用正则表达式选择正确的网卡,例如\”interface=eth.*\”表示选择名称以eth开头的网卡的IP地址。
– name: IP_AUTODETECTION_METHOD
value: \”interface=ens33\”
测试在k8s创建pod是否可以正常访问网络
#把busybox-1-28.tar.gz上传到xianchaonode1节点,手动解压
[root@xianchaonode1 ~]# ctr -n k8s.io images import busybox-1-28.tar.gz
[root@xianchaomaster1 ~]# kubectl run busybox –image docker.io/library/busybox:1.28 –image-pull-policy=IfNotPresent –restart=Never –rm -it busybox — sh
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
#通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # exit #退出pod
10.96.0.10 就是我们coreDNS的clusterIP,说明coreDNS配置好了。
解析内部Service的名称,是通过coreDNS去解析的。
#注意:
busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip
ctr和crictl区别
背景:在部署k8s的过程中,经常要对镜像进行操作(拉取、删除、查看等)
问题:使用过程中会发现ctr和crictl有很多相同功能,也有些不同,那区别到底在哪里?
说明:
1.ctr是containerd自带的CLI命令行工具,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互;
[root@xianchaonode1 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
systemctl restart containerd
2.ctr和crictl命令具体区别如下,也可以–help查看。crictl缺少对具体镜像的管理能力,可能是k8s层面镜像管理可以由用户自行控制,能配置pod里面容器的统一镜像仓库,镜像的管理可以有habor等插件进行处理。
扩容k8s集群,添加第二个工作节点
启动一台新的机器xianchaonode2
修改机器IP,变成静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33文件
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.40.182
NETMASK=255.255.255.0
GATEWAY=192.168.40.2
DNS1=192.168.40.2
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
#修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
注:/etc/sysconfig/network-scripts/ifcfg-ens33文件里的配置说明:
NAME=ens33 #网卡名字,跟DEVICE名字保持一致即可
DEVICE=ens33 #网卡设备名,大家ip addr可看到自己的这个网卡设备名,每个人的机器可能这个名字不一样,需要写自己的
BOOTPROTO=static #static表示静态ip地址
ONBOOT=yes #开机自启动网络,必须是yes
IPADDR=192.168.40.182 #ip地址,需要跟自己电脑所在网段一致
NETMASK=255.255.255.0 #子网掩码,需要跟自己电脑所在网段一致
GATEWAY=192.168.1.2 #网关,在自己电脑打开cmd,输入ipconfig /all可看到
DNS1=192.168.1.2 #DNS,在自己电脑打开cmd,输入ipconfig /all可看到
执行如下命令更新yum源和操作系统:
yum update -y
安装基础软件包:
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
关闭selinux,所有k8s机器均操作
sed -i \’s/SELINUX=enforcing/SELINUX=disabled/g\’ /etc/selinux/config
#修改selinux配置文件之后,重启机器,selinux配置才能永久生效,重启之后,登录到机器,执行如下命令:
getenforce
#如果显示Disabled说明selinux已经关闭
配置机器主机名
在192.168.40.182上执行如下:
hostnamectl set-hostname xianchaonode2 && bash
配置主机hosts文件,相互之间通过主机名互相访问
修改每台机器的/etc/hosts文件,文件最后增加如下内容:
192.168.40.180 xianchaomaster1
192.168.40.181 xianchaonode1
192.168.40.182 xianchaonode2
修改之后的文件如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.40.180 xianchaomaster1
192.168.40.181 xianchaonode1
192.168.40.182 xianchaonode2
配置xianchaomaster1登录xianchaonode2免密码登录
配置xianchaomaster1到其他机器免密登录
把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@xianchaomaster1 ~]# ssh-copy-id xianchaonode2
关闭交换分区swap,提升性能
[root@xianchaonode2 ~]# swapoff -a
[root@xianchaonode2 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
1.1.7 修改机器内核参数
[root@xianchaonode2 ~]# modprobe br_netfilter
[root@xianchaonode2~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@ xianchaonode2~]# sysctl -p /etc/sysctl.d/k8s.conf
1.1.8 关闭firewalld防火墙
[root@xianchaonode2~]# systemctl stop firewalld ; systemctl disable firewalld
1.1.9 配置阿里云的repo源
[root@xianchaonode2 ~]#yum install yum-utils -y
[root@xianchaonode2 ~]# yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.1.10 配置安装k8s组件需要的阿里云的repo源
[root@xianchaonode2 ~]#cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
1.1.11 配置时间同步
在xianchaonode2上执行如下:
#安装ntpdate命令
[root@xianchaonode2 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@xianchaonode2 ~]#ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@xianchaonode2 ~]#crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
1.2.1 安装containerd
[root@xianchaonode2 ~]#yum install containerd.io-1.6.6 -y
接下来生成 containerd 的配置文件:
[root@xianchaonode2 ~]#mkdir -p /etc/containerd
[root@xianchaonode2 ~]#containerd config default > /etc/containerd/config.toml
修改配置文件:
打开/etc/containerd/config.toml
把SystemdCgroup = false修改成SystemdCgroup = true
把sandbox_image = \”k8s.gcr.io/pause:3.6\”修改成sandbox_image=\”registry.aliyuncs.com/google_containers/pause:3.7\”
配置 containerd 开机启动,并启动 containerd
[root@xianchaonode2 ~]#systemctl enable containerd –now
修改/etc/crictl.yaml文件
[root@xianchaonode2 ~]#cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@xianchaonode2 ~]#systemctl restart containerd
配置containerd镜像加速器,按照以下方法配置:
编辑vim /etc/containerd/config.toml文件
找到config_path = \”\”,修改成如下目录:
config_path = \”/etc/containerd/certs.d\”
#保存退出
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host.\”https://vh3bm52y.mirror.aliyuncs.com\”,host.\”https://registry.docker-cn.com\”]
capabilities = [\”pull\”,\”push\”]
重启containerd:
systemctl restart containerd
备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
[root@xianchaonode2 ~]#yum install docker-ce -y
[root@xianchaonode2 ~]#systemctl enable docker –now
配置docker镜像加速器
vim /etc/docker/daemon.json
写入如下内容:
{
\”registry-mirrors\”:[\”https://vh3bm52y.mirror.aliyuncs.com\”,\”https://registry.docker-cn.com\”,\”https://docker.mirrors.ustc.edu.cn\”,\”https://dockerhub.azk8s.cn\”,\”http://hub-mirror.c.163.com\”]
}
重启docker:
systemctl restart docker
1.3、安装初始化k8s需要的软件包
[root@xianchaonode2 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xianchaonode2 ~]# systemctl enable kubelet
注:每个软件包的作用
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
把xianchaonode2加入到K8s集群:
在xianchaomaster1上查看加入节点的命令:
[root@xianchaomaster1 ~]# kubeadm token create –print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 –token vulvta.9ns7da3saibv4pg1 –discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
把xianchaonode2加入k8s集群:
[root@xianchaonode2 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xianchaonode2 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@xianchaonode2~]# kubeadm join 192.168.40.180:6443 –token vulvta.9ns7da3saibv4pg1 –discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a –ignore-preflight-errors=SystemVerification
#在xianchaomaster1上查看集群节点状况:
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 Ready control-plane,master 49m v1.26.0
xianchaonode1 Ready <none> 39s v1.26.0
xianchaonode2 Ready <none> 39s v1.26.0
扩容k8s集群,添加第二个控制节点
启动一台新的机器xianchaomaster2
配置静态ip
ip:192.168.40.186
安装基础软件包:
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
关闭selinux,所有k8s机器均操作
sed -i \’s/SELINUX=enforcing/SELINUX=disabled/g\’ /etc/selinux/config
#修改selinux配置文件之后,重启机器,selinux配置才能永久生效,重启之后,登录到机器,执行如下命令:
getenforce
#如果显示Disabled说明selinux已经关闭
配置机器主机名
在192.168.40.186上执行如下:
hostnamectl set-hostname xianchaomaster2 && bash
配置主机hosts文件,相互之间通过主机名互相访问
修改每台机器的/etc/hosts文件,文件最后增加如下内容:
192.168.40.180 xianchaomaster1
192.168.40.181 xianchaonode1
192.168.40.186 xianchaomaster2
修改之后的文件如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.40.180 xianchaomaster1
192.168.40.181 xianchaonode1
192.168.40.186 xianchaomaster2
配置xianchaomaster1登录xianchaomaster2免密码登录
配置xianchaomaster1到其他机器免密登录
把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@xianchaomaster1 ~]# ssh-copy-id xianchaomaster2
关闭交换分区swap,提升性能
[root@xianchaomaster2~]# swapoff -a
[root@xianchaomaster2 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
修改机器内核参数
[root@xianchaomaster2 ~]# modprobe br_netfilter
[root@xianchaomaster2~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@ xianchaomaster2~]# sysctl -p /etc/sysctl.d/k8s.conf
关闭firewalld防火墙
[root@xianchaomaster2~]# systemctl stop firewalld ; systemctl disable firewalld
配置阿里云的repo源
[root@xianchaomaster2 ~]#yum install yum-utils -y
[root@xianchaomaster2 ~]# yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置安装k8s组件需要的阿里云的repo源
[root@xianchaomaster2 ~]#cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
配置时间同步
在xianchaomaster2上执行如下:
#安装ntpdate命令
[root@xianchaomaster2 ~]#yum install ntpdate -y
#跟网络时间做同步
[root@xianchaomaster2 ~]#ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@xianchaomaster2 ~]#crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
安装containerd
[root@xianchaomaster2 ~]#yum install containerd.io-1.6.6 -y
接下来生成 containerd 的配置文件:
[root@xianchaomaster2 ~]#mkdir -p /etc/containerd
[root@xianchaomaster2 ~]#containerd config default > /etc/containerd/config.toml
修改配置文件:
打开/etc/containerd/config.toml
把SystemdCgroup = false修改成SystemdCgroup = true
把sandbox_image = \”k8s.gcr.io/pause:3.6\”修改成sandbox_image=\”registry.aliyuncs.com/google_containers/pause:3.7\”
配置 containerd 开机启动,并启动 containerd
[root@xianchaomaster2 ~]#systemctl enable containerd –now
修改/etc/crictl.yaml文件
[root@xianchaomaster2 ~]#cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@xianchaomaster2 ~]#systemctl restart containerd
配置containerd镜像加速器,按照以下方法配置:
编辑vim /etc/containerd/config.toml文件
找到config_path = \”\”,修改成如下目录:
config_path = \”/etc/containerd/certs.d\”
#保存退出
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host.\”https://vh3bm52y.mirror.aliyuncs.com\”,host.\”https://registry.docker-cn.com\”]
capabilities = [\”pull\”,\”push\”]
重启containerd:
systemctl restart containerd
备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
[root@xianchaomaster2 ~]#yum install docker-ce -y
[root@xianchaomaster2 ~]#systemctl enable docker –now
配置docker镜像加速器
vim /etc/docker/daemon.json
写入如下内容:
{
\”registry-mirrors\”:[\”https://vh3bm52y.mirror.aliyuncs.com\”,\”https://registry.docker-cn.com\”,\”https://docker.mirrors.ustc.edu.cn\”,\”https://dockerhub.azk8s.cn\”,\”http://hub-mirror.c.163.com\”]
}
重启docker:
systemctl restart docker
安装初始化k8s需要的软件包
[root@xianchaomaster2 ~]#yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xianchaomaster2 ~]# systemctl enable kubelet
注:每个软件包的作用
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
把xianchaomaster2加入到K8s集群:
#把xianchaomaster1节点的证书拷贝到xianchaomaster2上
在xianchaomaster2创建证书存放目录:
[root@xianchaomaster2 ~]# cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/
#把xianchaomaster1节点的证书拷贝到xianchaomaster2上:
scp /etc/kubernetes/pki/ca.crt xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/ca.key xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.key xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.pub xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.crt xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.key xianchaomaster2:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/etcd/ca.crt xianchaomaster2:/etc/kubernetes/pki/etcd/
scp /etc/kubernetes/pki/etcd/ca.key xianchaomaster2:/etc/kubernetes/pki/etcd/
#证书拷贝之后在xianchaomaster2上执行如下命令,大家复制自己的,这样就可以把xianchaomaster2和加入到集群,成为控制节点:
在xianchaomaster2上执行:
把安装calico需要的镜像calico.tar.gz传到xianchaomaster1和xianchaonode1节点,手动解压:
[root@xianchaomaster2 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xianchaomaster2 ~]# ctr -n=k8s.io images import calico.tar.gz
检查 kubeadm-config ConfigMap 是否正确配置了 controlPlaneEndpoint。可以使用 kubectl 命令获取 kubeadm-config ConfigMap 的信息:
[root@xianchaomaster1 ~]# kubectl -n kube-system edit cm kubeadm-config -o yaml
添加如下字段:
controlPlaneEndpoint: \”192.168.40.180:6443\”
重启kubelet:
[root@xianchaomaster1 ~]# systemctl restart kubelet
在xianchaomaster1上查看加入节点的命令:
[root@xianchaomaster1 ~]# kubeadm token create –print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 –token zwzcks.u4jd8lj56wpckcwv \\
–discovery-token-ca-cert-hash sha256:1ba1b274090feecfef58eddc2a6f45590299c1d0624618f1f429b18a064cb728
[root@xianchaomaster2 ~]#kubeadm join 192.168.40.180:6443 –token zwzcks.u4jd8lj56wpckcwv \\
–discovery-token-ca-cert-hash sha256:1ba1b274090feecfef58eddc2a6f45590299c1d0624618f1f429b18a064cb728 \\
–control-plane –ignore-preflight-errors=SystemVerification
[root@xianchaomaster2 ~]# mkdir -p $HOME/.kube
[root@xianchaomaster2 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@xianchaomaster2 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
在xianchaomaster1上查看集群状况:
xianchaomaster1 Ready control-plane,master 58m v1.26.0
xianchaonode1 Ready <none> 58s v1.26.0
xianchaomaster2 Ready control-plane,master 58s v1.26.0
上面可以看到xianchaomaster2已经加入到集群了
#以上关于k8s Kubernetes 1.26 部署安装示例 双控制(双master)节点的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92544.html