Centos7和Ubuntu20中使用kubeadm搭建k8s集群

集群类型

● Kubernetes集群大致分为两类:一主多从和多主多从。

● 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境(本次采用方式)。

● 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境(后续)。

安装方式

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。

  • minikube:一个用于快速搭建单节点的kubernetes工具。
  • kubeadm:一个用于快速搭建kubernetes集群的工具(本次采用方式)。
  • 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。

除官方工具kubespray 、kops外,还可选择众多的第三方工具的安装,如rancher(SUSE)、RKE(SUSE)、kubesphere、kuboard、灵雀云、MicroK8s(Ubuntu)、Charmed Kubernetes(Ubuntu)等。

本次选择kubeadm方式

一、Ubunt环境

1. 环境规划

角色主机名主机配置IP地址
masterk8s-master2核CPU,2G内存,50G硬盘192.168.3.13
nodek8s-node012核CPU,2G内存,50G硬盘192.168.3.14
nodek8s-node022核CPU,2G内存,50G硬盘192.168.3.15

2. 软件版本

软件版本
OSUbuntu server 22.04 LTS
DockerDocker version 20.10.21
Kubernetesv1.25.4

3. 初始化配置(所有节点)

整个安装部署使用非 root 身份

如果需要使用root,请按如下操作:

#设置root登录
sudo passwd root

sudo vim /etc/ssh/sshd_config
PermitRootLogin yes # 添加

sudo systemctl restart sshd.service

3.1 设置IP地址

#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

3.2 设置主机名

sudo hostnamectl set-hostname k8s-master
sudo hostnamectl set-hostname k8s-node01
sudo hostnamectl set-hostname k8s-node02

3.3 设置主机解析

cat >> /etc/hosts <<EOF
192.168.3.13	k8s-master
192.168.3.14	k8s-node01
192.168.3.15	k8s-node02
EOF

3.4 修改apt源

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

3.4 设置主机安全

在自己的学习环境时,可以直接关闭防火墙

生产环境,尽量使用防火墙,开放指定端口

#关闭防火墙
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

3.6 禁用swap

#Ubuntu 20.04,执行下面命令
sudo sed -ri 's/.swap./#&/' etc/fstab  #永久关闭swap
sudo swapoff -a      #从/proc/swaps中禁止所有swap
#确认swap一行已经注释
grep swap etc/fstab

3.7 时间同步

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

3.8 配置免密登录(可选)

#配置完等效性后可以免密登录,便于后续操作维护方便
#每台创建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

3.9 允许 iptables 检查桥接流量

官方参考: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

3.10 开启ipvs

在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

3.11 必备工具安装

sudo apt -y install tree lrzsz jq curl wget vim git

4. 安装Docker/cri-dockerd/kubeadm/kubelet/kubectl(所有节点)

4.1 安装Docker-ce

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

4.2 安装cri-dockerd

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

4.3 安装kubeadm,kubelet和kubectl

# 添加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

5. 部署Kubernetes Master

在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

6. 加入节点

在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。

7. 部署容器网络接口(CNI)Calico

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了。

8. 部署Dashboard

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哦

  • https://192.168.3.13:30001/#/login
  • https://192.168.3.14:30001/#/login
  • https://192.168.3.15:30001/#/login

创建登录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节点执行(部署操作),切记!

二、CentOS7环境

1. 环境规划

角色主机名主机配置IP地址
masterk8s-master2核CPU,2G内存,50G硬盘192.168.3.10
nodek8s-node012核CPU,2G内存,50G硬盘192.168.3.11
nodek8s-node022核CPU,2G内存,50G硬盘192.168.3.12

2. 软件版本

软件版本
OSCentOS Linux release 7.9.2009
DockerDocker version 20.10.21
Kubernetesv1.25.4

3. 初始化配置(所有节点)

3.1 设置IP地址

#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

3.2 设置主机名

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

3.3 设置主机解析

cat >> /etc/hosts <<EOF
192.168.3.10	k8s-master
192.168.3.11	k8s-node01
192.168.3.12	k8s-node02
EOF

3.4 修改YUM源

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

3.4 设置主机安全

在自己的学习环境时,可以直接关闭防火墙

生产环境,尽量使用防火墙,开放指定端口

#关闭防火墙
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

3.6 禁用swap

swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
#确认swap一行已经注释
grep swap etc/fstab

3.7 时间同步

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

3.8 配置免密登录(可选)

#配置完等效性后可以免密登录,便于后续操作维护方便
#每台创建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

3.9 允许 iptables 检查桥接流量

官方参考: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

3.10 开启ipvs

在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

3.11 优化资源限制

#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

3.12 系统内核升级

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
#注意:原来使用的内核版本建议不要删除,如果遇到问题可以进行回退。

3.13 必备工具安装

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

4. 安装Docker/cri-dockerd/kubeadm/kubelet/kubectl(所有节点)

4.1 安装Docker-ce

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

4.2 配置镜像下载加速器

# 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

4.3 安装cri-dockerd

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

4.4 指定依赖镜像地址

在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

4.5 添加阿里云yum软件源

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

4.6 安装kubeadm,kubelet和kubectl

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 

5. 部署Kubernetes Master

在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

6. 配置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
#查看工作节点
[root@k8s-master ~]# kubectl get nodes
NAME                STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   12m   v1.25.4

kubectl cluster-info

7. 加入Kubernetes Node

向集群添加新节点,执行在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

8. 部署容器网络接口(CNI)Calico

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

9. 部署Dashboard

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哦

  • https://192.168.11.13:30001/#/login
  • https://192.168.11.14:30001/#/login
  • https://192.168.11.15:30001/#/login

创建登录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复制进去即可完成登录

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值