集群类型
● Kubernetes集群大致分为两类:一主多从和多主多从。
● 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境(本次采用方式)。
● 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境(后续)。
安装方式
kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。
除官方工具kubespray 、kops外,还可选择众多的第三方工具的安装,如rancher(SUSE)、RKE(SUSE)、kubesphere、kuboard、灵雀云、MicroK8s(Ubuntu)、Charmed Kubernetes(Ubuntu)等。
本次选择kubeadm方式
角色 | 主机名 | 主机配置 | IP地址 |
---|---|---|---|
master | k8s-master | 2核CPU,2G内存,50G硬盘 | 192.168.3.13 |
node | k8s-node01 | 2核CPU,2G内存,50G硬盘 | 192.168.3.14 |
node | k8s-node02 | 2核CPU,2G内存,50G硬盘 | 192.168.3.15 |
软件 | 版本 |
---|---|
OS | Ubuntu server 22.04 LTS |
Docker | Docker version 20.10.21 |
Kubernetes | v1.25.4 |
整个安装部署使用非 root 身份
如果需要使用root,请按如下操作:
#设置root登录
sudo passwd root
sudo vim /etc/ssh/sshd_config
PermitRootLogin yes # 添加
sudo systemctl restart sshd.service
#Ubuntu
sudo nano /etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.3.13/24]
gateway4: 192.168.3.1
nameservers:
addresses: [223.5.5.5, 180.76.76.76]
sudo netplan apply
sudo hostnamectl set-hostname k8s-master
sudo hostnamectl set-hostname k8s-node01
sudo hostnamectl set-hostname k8s-node02
cat >> /etc/hosts <<EOF
192.168.3.13 k8s-master
192.168.3.14 k8s-node01
192.168.3.15 k8s-node02
EOF
sudo cp etc/apt/sources.list{,.`date "+%Y%m%d"`} #备份为当天日期文件
cat > /etc/apt/sources.list <<EOF
deb http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-proposed main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-proposed main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
deb-src http://mirrors.cloud.tencent.com/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
EOF
sudo apt list --upgradable
#查看可更新软件
sudo apt-get update -y
或者修改为阿里源
sudo apt update && \
sudo apt -y install curl apt-transport-https
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
#执行apt-get update,如果出现
The following signatures couldn’t be verified because the public key is not available
#需要添加key
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
在自己的学习环境时,可以直接关闭防火墙
生产环境,尽量使用防火墙,开放指定端口
#关闭防火墙
sudo systemctl stop ufw ; sudo systemctl disable ufw ; sudo ufw status
#Ubuntu没有安装SELinux,可以不用设置
注:ubuntu没有自带这个功能模块,不用管它需要下载安装, centos等需要禁用https://linuxconfig.org/how-to-disable-enable-selinux-on-ubuntu-20-04-focal-fossa-linux
#安装
sudo apt install -y policycoreutils
sestatus #查看状态
setenforce 0 #临时禁用
sudo nano /etc/selinux/config # 修改配置
SELINUX=disabled
或者:sudo sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sudo sed -i 's#=permissive#=disabled#g' etc/selinux/config #修改配置,永久禁用
sestatus #查看,确保状态为disabled
#Ubuntu 20.04,执行下面命令
sudo sed -ri 's/.swap./#&/' etc/fstab #永久关闭swap
sudo swapoff -a #从/proc/swaps中禁止所有swap
#确认swap一行已经注释
grep swap etc/fstab
K8S要求集群中的时间节点必须一致,这里使用chronyd(ntpd也可以)进行与阿里云ntp server同步,生产环境可使用自己的时间服务器。
#安装chrony
sudo apt install -y chrony
#注释掉所有以pool开头的
sudo sed -i 's/^pool/#pool/g' etc/chrony/chrony.conf
#新增两台阿里云ntp
sudo sed -i '/iburst maxsources 2/a server ntp1.aliyun.com iburst\nserver ntp2.aliyun.com iburst' etc/chrony/chrony.conf
#启动并查看服务
sudo systemctl enable --now chronyd && sudo systemctl status chronyd
#如果时区不对,设置为东八区
sudo timedatectl set-timezone Asia/Shanghai
#查看系统时间并确定时间同步
date && chronyc sources -v
#配置完等效性后可以免密登录,便于后续操作维护方便
#每台创建rsa公钥和私钥
ssh-keygen
#每台私钥传输到master节点
ssh-copy-id k8s-master
#master上的authorized传输到其它节点
for i in k8s-node01 k8s-node02 ; do scp ~/.ssh/authorized_keys $i:~/.ssh/ ; done
#ssh等效性验证
for i in k8s-master k8s-node01 k8s-node02
do
#echo $i && ssh $i date
echo -e "\033[31m $i: \033[0m `ssh $i date`"
done
官方参考:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
# 配置加载模块
cat <<EOF | sudo tee etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
#显式加载模块
modprobe overlay
modprobe br_netfilter
#为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。
cat <<EOF | sudo tee etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
#应用 sysctl 参数而不重新启动
sysctl --system
#查看是否加载
lsmod | grep 'br_netfilter\|overlay'
overlay 147456 0
br_netfilter 28672 0
bridge 299008 1 br_netfilter
在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。
# 在每个节点安装ipset和ipvsadm:
sudo apt -y install ipvsadm ipset sysstat conntrack libseccomp-dev
# 配置ipvs
sudo tee etc/modules-load.d/ipvs.conf << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack #内核小于4.18,把这行改成nf_conntrack_ipv4
EOF
# 临时加载
sudo modprobe -- ip_vs
sudo modprobe -- ip_vs_rr
sudo modprobe -- ip_vs_wrr
sudo modprobe -- ip_vs_sh
# 内核版本大于4.19,使用nf_conntrack,之前版本用nf_conntrack_ipv4模块,
# 否则会提示modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory lib/modules/5.15.0-40-generic
kernel_version=$(uname -r | cut -d- -f1) && echo $kernel_version
if [ `expr $kernel_version \> 4.19` -eq 1 ]
then
sudo modprobe -- nf_conntrack
else
sudo modprobe -- nf_conntrack_ipv4
fi
# 加载并查看模块
sudo bash etc/modules-load.d/ipvs.conf && lsmod | grep -e ip_vs -e nf_conntrack
sudo apt -y install tree lrzsz jq curl wget vim git
sudo apt-get -y install apt-transport-https ca-certificates software-properties-common
#添加key
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#设置阿里云镜像源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update && sudo apt-get -y install docker-ce
# Create required directories
sudo mkdir -p /etc/systemd/system/docker.service.d
# 配置镜像下载加速器
sudo tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload && sudo systemctl restart docker && sudo docker info
sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
sudo dpkg -i cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
# 指定依赖镜像地址
sudo vi /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:latest
sudo systemctl daemon-reload && sudo systemctl enable cri-docker && sudo systemctl restart cri-docker
# 添加k8s的阿里云apt源
sudo apt-get install -y apt-transport-https ca-certificates
# 此处使用 kubernetes-xenial 而不是 Ubuntu 20.04 的focal
sudo vi /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update -y
# 开始安装
sudo apt-get install -y kubelet kubeadm kubectl
sudo systemctl enable kubelet.service
# 查看安装情况及版本
kubectl version --client && kubeadm version
在192.168.3.13(Master)执行
sudo kubeadm init \
--apiserver-advertise-address=192.168.3.13 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
配置kubectl使用的连接k8s认证文件
# 普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果想用root用户来操作,则配置一个环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
在2台node节点上执行
sudo kubeadm join 192.168.3.13:6443 --token o37091.z858bts6jmth9irz \
--discovery-token-ca-cert-hash sha256:628a5b50227c93e465adc1ca380cf335e8f639c15c8a92892f9d22b71ac6c2ac \
--cri-socket=unix:///var/run/cri-dockerd.sock
上面用到的token,默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
sudo kubeadm token create --print-join-command
#加入后在master查看工作节点
kubectl get nodes
目前工作节点的状态为NotReady,是因为还没有部署网络插件,等部署完就会处于Ready。
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。下面开始部署Calico,在master上进行部署操作。
下载calico的YAML:
sudo wget https://docs.projectcalico.org/manifests/calico.yaml
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
calico.yaml中CALICO_IPV4POOL_CIDR默认的配置如下:
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
取消注释,并修改成与前面kubeadm init的 --pod-network-cidr(10.244.0.0/16)指定的一样。
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
修改完后文件后,开始部署:
# 部署calico
kubectl apply -f calico.yaml
接下来就是比较漫长的等待,等待多久取决于你的网速,如果网络的好的话,就会更快一点,因为它还要拉镜像,而且是3台节点都要拉取相关镜像,下面可以在master上查看位于kube-system命名空间下的pod。
kubectl get pods -n kube-system
#刚才提到,在部署calico的过程中3台节点都需要拉取相关镜像,可以到其中1台Node上查看有没有镜像了:
sudo docker images
#继续查看工作节点的状态,也是Ready状态了
kubectl get nodes
等calico的全部pod状态都为Running的时候,就成功了。到时候你再去查看node的状态,应该也会为Ready了。
Dashboard是官方提供的一个UI,可用于基本管理K8s资源,也是在master上进行部署操作。
github项目地址:
https://github.com/kubernetes/dashboard
YAML下载地址:
sudo wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,下载yaml文件后,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 # 增加这个(等会我们访问UI的端口)
selector:
k8s-app: kubernetes-dashboard
type: NodePort # 增加这个(让每个节点都可访问)
开始部署
kubectl apply -f recommended.yaml
这时候,也是需要等待到dashboard相关的pod为Running的状态,它也是要拉镜像,可查看命名空间kubernetes-dashboard下的pod:
kubectl get pods -n kubernetes-dashboard
等待后,再次查看,dashboard相关的pod已经为Running的状态,说明已经部署好
接下来就可以访问任意节点的30001端口访问UI,记得是用https哦
创建登录UI的token
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl create token dashboard-admin -n kubernetes-dashboard
将创建好的token复制进去即可完成登录
最后说明一下,以后所有yaml文件都只在Master节点执行(部署操作),切记!
角色 | 主机名 | 主机配置 | IP地址 |
---|---|---|---|
master | k8s-master | 2核CPU,2G内存,50G硬盘 | 192.168.3.10 |
node | k8s-node01 | 2核CPU,2G内存,50G硬盘 | 192.168.3.11 |
node | k8s-node02 | 2核CPU,2G内存,50G硬盘 | 192.168.3.12 |
软件 | 版本 |
---|---|
OS | CentOS Linux release 7.9.2009 |
Docker | Docker version 20.10.21 |
Kubernetes | v1.25.4 |
#CentOS
[root@k8s-master ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.3.10
PREFIX=24
GATEWAY=192.168.3.1
DNS1=223.5.5.5
DNS2=180.76.76.76
systemctl restart network
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
cat >> /etc/hosts <<EOF
192.168.3.10 k8s-master
192.168.3.11 k8s-node01
192.168.3.12 k8s-node02
EOF
cat > /etc/yum.repos.d/centos-tuna.repo << 'EOF'
[base]
name=CentOS-\$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/os/\$basearch/
enabled=1
gpgcheck=0
#released updates
[updates]
name=CentOS-\$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/updates/\$basearch/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/updates/\$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=\$releasever&arch=\$basearch&repo=updates
enabled=1
gpgcheck=0
#additional packages that may be useful
[centosplus]
name=CentOS-\$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/centosplus/\$basearch/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/centosplus/\$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=\$releasever&arch=\$basearch&repo=centosplus
enabled=1
gpgcheck=0
[cloud]
name=CentOS-\$releasever - Cloud
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/cloud/\$basearch/openstack-train/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/cloud/\$basearch/openstack-train/
enabled=1
gpgcheck=0
[paas]
name=CentOS-\$releasever - paas
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/paas/\$basearch/openshift-origin13/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/paas/\$basearch/openshift-origin13/
enabled=1
gpgcheck=0
[kvm]
name=CentOS-\$releasever - kvm
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/virt/\$basearch/kvm-common/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/virt/\$basearch/kvm-common/
enabled=1
gpgcheck=0
[extras]
name=CentOS-\$releasever - extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/extras/\$basearch/
#baseurl=https://mirrors.aliyun.com/centos/\$releasever/extras/\$basearch/
enabled=1
gpgcheck=0
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
[elrepo]
name=ELRepo.org Community Enterprise Linux Repository - el7
baseurl=http://mirrors.tuna.tsinghua.edu.cn/elrepo/elrepo/el7/x86_64/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0
[elrepo-kernel]
name=ELRepo.org Community Enterprise Linux Kernel Repository - el7
baseurl=http://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0
[elrepo-extras]
name=ELRepo.org Community Enterprise Linux Extras Repository - el7
baseurl=http://mirrors.tuna.tsinghua.edu.cn/elrepo/extras/el7/x86_64/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0
EOF
在自己的学习环境时,可以直接关闭防火墙
生产环境,尽量使用防火墙,开放指定端口
#关闭防火墙
systemctl disable --now firewalld
systemctl disable --now NetworkManager
firewall-cmd --state
#关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
#确认swap一行已经注释
grep swap etc/fstab
K8S要求集群中的时间节点必须一致,这里使用chronyd(ntpd也可以)进行与阿里云ntp server同步,生产环境可使用自己的时间服务器。
#安装chrony
yum install -y chrony
#注释掉所有以pool开头的
sed -i 's/^pool/#pool/g' etc/chrony/chrony.conf
#新增两台阿里云ntp
sed -i '/iburst maxsources 2/a server ntp1.aliyun.com iburst\nserver ntp2.aliyun.com iburst' etc/chrony/chrony.conf
#启动并查看服务
systemctl enable --now chronyd && systemctl status chronyd
#如果时区不对,设置为东八区
timedatectl set-timezone Asia/Shanghai
#查看系统时间并确定时间同步
date && chronyc sources -v
#配置完等效性后可以免密登录,便于后续操作维护方便
#每台创建rsa公钥和私钥
ssh-keygen
#每台私钥传输到master节点
ssh-copy-id k8s-master
#master上的authorized传输到其它节点
for i in k8s-node01 k8s-node02 ; do scp ~/.ssh/authorized_keys $i:~/.ssh/ ; done
#ssh等效性验证
for i in k8s-master k8s-node01 k8s-node02
do
#echo $i && ssh $i date
echo -e "\033[31m $i: \033[0m `ssh $i date`"
done
官方参考:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
# 配置加载模块
cat <<EOF | sudo tee etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
#显式加载模块
modprobe overlay
modprobe br_netfilter
#为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。
cat <<EOF | sudo tee etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
#应用 sysctl 参数而不重新启动
sysctl --system
#查看是否加载
lsmod | grep 'br_netfilter\|overlay'
overlay 147456 0
br_netfilter 28672 0
bridge 299008 1 br_netfilter
在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。
# 在每个节点安装ipset和ipvsadm:
yum -y install ipvsadm ipset sysstat conntrack libseccomp-dev
# 配置ipvs
cat > /etc/modules-load.d/ipvs.conf << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack #内核小于4.18,把这行改成nf_conntrack_ipv4
EOF
# 临时加载
sudo modprobe -- ip_vs
sudo modprobe -- ip_vs_rr
sudo modprobe -- ip_vs_wrr
sudo modprobe -- ip_vs_sh
# 内核版本大于4.19,使用nf_conntrack,之前版本用nf_conntrack_ipv4模块,
# 否则会提示modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory lib/modules/5.15.0-40-generic
kernel_version=$(uname -r | cut -d- -f1) && echo $kernel_version
if [ `expr $kernel_version \> 4.19` -eq 1 ]
then
sudo modprobe -- nf_conntrack
else
sudo modprobe -- nf_conntrack_ipv4
fi
# 加载并查看模块
bash /etc/modules-load.d/ipvs.conf && lsmod | grep -e ip_vs -e nf_conntrack
#设置为开机启动:
systemctl enable --now systemd-modules-load.service
#limit优化
ulimit -SHn 65535
cat >>/etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
CentOS7内核是3.10,kubernetes需要的内核是4.18或以上版本,CentOS7需要升级内核才可以稳定运行kubernetes各组件,其它系统根据自己的需求去升级。CentOS7 需要升级内核至4.18+,本此升级的版本为5.19。
#安装依赖包
yum -y install perl
#升级内核需要先导入elrepo的key,然后安装elrepo的yum源,启用 ELRepo 仓库
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#仓库启用后,你可以使用下面的命令列出可用的内核相关包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# -ml 最新版本的版本
# -lt 长期支持的版本
# 也可通过官方源地址查看: http://elrepo.reloumirrors.net/kernel/el7/x86_64/RPMS/
#安装最新的主线稳定内核
yum --enablerepo="elrepo-kernel" -y install kernel-ml kernel-ml-devel.x86_64
#查看系统可用内核,并设置启动项
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
#指定开机GRUB默认启动内核版本
grub2-set-default 0
#新创建内核配置
grub2-mkconfig -o /etc/grub2.cfg
#检查默认内核是不是5.19
grubby --default-kernel
#重启后再次检查
reboot
uname -r
#注意:原来使用的内核版本建议不要删除,如果遇到问题可以进行回退。
yum install -y wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git lrzsz
yum install -y nfs-utils gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo libaio-devel ncurses-devel autoconf automake zlib-devel python-devel conntrack
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
# Create required directories
sudo mkdir -p /etc/systemd/system/docker.service.d
# 配置镜像下载加速器
sudo tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
docker info
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.2.6-3.el7.x86_64.rpm
在cri-docker.service配置中的 fd:// 后面增加
–pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 说明:pause:3.7 也可以指向最新的版本 pause:latest
vi /usr/lib/systemd/system/cri-docker.service
# 修改内容:
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
cat > /etc/yum.repos.d/kubernetes.repo << 'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.25.4 kubeadm-1.25.4 kubectl-1.25.4
# 修改kubelet的Cgroup和代理模式ipvs
cat > /etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
systemctl enable --now kubelet.service
在192.168.11.3(Master)执行
kubeadm init \
--apiserver-advertise-address=192.168.3.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
在进行更改之前,运行一些列检查,验证系统状态,有些检查只会触发警告,有些检查会被视为错误并退出kubeadm,因此使用 --ignore-preflight-errors=all 忽略检查中的错误。
初始化完成之后,最后会出现下面这样的提示:
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:
或者,如果您是root用户,则可以运行:
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/
Then you can join any number of worker nodes by running the following on each as root:
# 记住这个join命令,后面用,作用是在node节点运行这条命令,加入集群
kubeadm join 192.168.3.10:6443 --token pk474p.uvc65opv1zs625lq \
--discovery-token-ca-cert-hash sha256:c14439c309345c6a02340bb7df74108c4cde6e0f8393f45a123f347f11b98b57
# 普通用户要开始使用集群,您需要以普通用户身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 或者,如果您是root用户,则可以运行(可以加入到环境变量):
export KUBECONFIG=/etc/kubernetes/admin.conf
#查看工作节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 12m v1.25.4
kubectl cluster-info
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令并手动加上–cri-socket=
unix:///var/run/cri-dockerd.sock
# 在2台node上运行(192.168.3.11、192.168.3.12)
kubeadm join 192.168.11.10:6443 --token pk474p.uvc65opv1zs625lq \
--discovery-token-ca-cert-hash sha256:c14439c309345c6a02340bb7df74108c4cde6e0f8393f45a123f347f11b98b57 \
--cri-socket=unix:///var/run/cri-dockerd.sock
上面用到的token,默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。下面开始部署Calico,在master上进行部署操作。
下载calico的YAML:
wget https://docs.projectcalico.org/manifests/calico.yaml
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
calico.yaml中CALICO_IPV4POOL_CIDR默认的配置如下:
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
取消注释,并修改成与前面kubeadm init的 --pod-network-cidr指定的一样。
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
修改完后文件后,开始部署:
# 部署calico
kubectl apply -f calico.yaml
# 查看kube-system命名空间下的pod
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-798cc86c47-pd8zc 0/1 ContainerCreating 0 82s
calico-node-d54c9 0/1 Init:0/3 0 82s
calico-node-prpdl 0/1 Init:0/3 0 82s
calico-node-rkwzv 1/1 Running 0 82s
coredns-c676cc86f-kw9v8 1/1 Running 0 26m
coredns-c676cc86f-vfwz7 1/1 Running 0 26m
etcd-test-a-k8s-master 1/1 Running 0 26m
kube-apiserver-test-a-k8s-master 1/1 Running 0 26m
kube-controller-manager-test-a-k8s-master 1/1 Running 0 26m
kube-proxy-kv9rx 1/1 Running 0 26m
kube-proxy-qphqt 0/1 ContainerCreating 0 11m
kube-proxy-z5fjm 0/1 ContainerCreating 0 11m
kube-scheduler-test-a-k8s-master 1/1 Running 0 26m
说明:以后所有yaml文件都只在Master节点执行。
等Calico Pod都Running,节点也会准备就绪。
#查看pod
watch kubectl get pods --all-namespaces
#再次查看工作节点,已经为Ready状态
kubectl get nodes -o wide
Dashboard是官方提供的一个UI,可用于基本管理K8s资源,也是在master上进行部署操作。
github项目地址:
https://github.com/kubernetes/dashboard
YAML下载地址:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,下载yaml文件后,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 # 增加这个(等会我们访问UI的端口)
selector:
k8s-app: kubernetes-dashboard
type: NodePort # 增加这个(让每个节点都可访问)
开始部署
kubectl apply -f recommended.yaml
这时候,也是需要等待到dashboard相关的pod为Running的状态,它也是要拉镜像,可查看命名空间kubernetes-dashboard下的pod:
kubectl get pods -n kubernetes-dashboard
等待后,再次查看,dashboard相关的pod已经为Running的状态,说明已经部署好
接下来就可以访问任意节点的30001端口访问UI,记得是用https哦
创建登录UI的token
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
kubectl create token dashboard-admin -n kubernetes-dashboard
将创建好的token复制进去即可完成登录