LOADING

加载过慢请开启缓存 浏览器默认开启

Ubuntu22.04搭建Kubernetes1.27集群

Ubuntu22.04搭建Kubernetes1.27集群

准备工作

本文环境通过VirtualBox搭建Ubuntu集群,操作步骤见
Windows11下VirtualBox搭建Ubuntu

环境说明

1. 硬件环境

  • 虚拟机硬件规格:Master(2CPU 4G 40GB) Node(2CPU 2G 40GB)
  • 虚拟机数量: 3台
  • 虚拟机操作系统:ubuntu-22.04.5-live-server-amd64.iso
操作系统 主机名 IP
ubuntu-22.04.5 k8s-master 192.168.112.174
ubuntu-22.04.5 k8s-node1 192.168.112.175
ubuntu-22.04.5 k8s-node2 192.168.112.176

2. 关闭swap分区

  • 永久关闭:编辑/etc/fstab文件,将swap分区的UUID注释掉,重启后生效。
  • 临时关闭:执行swapoff -a命令。

3. 关闭SELinux

  • 永久关闭:编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,重启后生效。
  • 临时关闭:执行setenforce 0命令。

4. 网络配置

  • 配置host
# 修改机器名称
vim /etc/hostname
# 修改hosts
vim /etc/hosts
# 添加以下内容,这里的ip地址和hostname根据实际情况填写
192.168.112.174 k8s-master
192.168.112.175 k8s-node1
192.168.112.176 k8s-node2
  • 转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
lsmod | grep br_netfilter #验证br_netfilter模块
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
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 参数而不重新启动
sudo sysctl --system

安装containerd

  • 下载1.7.13
wget https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
sudo tar -zxvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
containerd -v
  • 配置containerd
#创建配置目录
sudo mkdir /etc/containerd
#生成默认配置文件
containerd config default
containerd config default | sudo tee /etc/containerd/config.toml
#编辑默认配置文件
sudo vi /etc/containerd/config.toml
#修改以下配置
#sandbox_image 值为 registry.aliyuncs.com/google_containers/pause:3.9
#————————————————————————————————
#SystemdCgroup 为 true
#————————————————————————————————
#若需要使用ip地址的私有镜像仓库,可修改以下配置
#    [plugins."io.containerd.grpc.v1.cri".registry]
#      config_path = "/etc/containerd/certs.d"
# 创建配置文件 /etc/containerd/certs.d/<registry-name>/hosts.toml,并添加以下内容:
#server = "http://10.0.0.10:5000"
#
#[host."10.0.0.10:5000"]
#  capabilities = ["pull", "resolve", "push"]
#  skip_verify = true
#配置Docker Hub镜像加速
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://dockerproxy.cn"]
  capabilities = ["pull", "resolve"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOF
#配置registry.k8s.io镜像加速
mkdir -p /etc/containerd/certs.d/registry.k8s.io
tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"

[host."https://k8s.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF
#启动containerd
sudo systemctl enable --now containerd

安装Kubernetes

  • 安装kubeadm、kubectl、kubelet
#修改镜像地址
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
 
#更新包,安装软件并固定版本
sudo apt-get update
#apt-get update若报错xxx  kubernetes-xenial InRelease' is not signed.
#可执行curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -重新添加密钥
sudo apt-get install -y kubelet=1.27.1-00 kubeadm=1.27.1-00 kubectl=1.27.1-00
#固定版本
sudo apt-mark hold kubeadm kubectl

Master节点初始化集群

  • 初始化集群
#生成默认配置文件
kubeadm config print init-defaults > kubeadm.yaml
#修改kubeadm.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.112.174 # master节点ip
      bindPort: 6443
      nodeRegistration:
      criSocket: unix:///var/run/containerd/containerd.sock
      imagePullPolicy: IfNotPresent
      name: k8s-master  # 可选修改当前节点名字
      taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers   # 换源
kind: ClusterConfiguration
kubernetesVersion: 1.27.1  # 修改自己安装的版本号,kubelet --version可以查看
networking:
podSubnet: 10.244.0.0/16 # 添加子网
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
# 添加驱动:使用systemd作为cgroup驱动。
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
#初始化集群
sudo kubeadm init --config kubeadm.yaml --v=6
#如果执行初始化指令报错了一次,请执行reset指令重新再来否则会提示k8s所需的配置文件已经存在无法初始化
sudo kubeadm reset --cert-dir string
  • 初始化成功后如下图所示,在本机执行黄色框内命令,子节点执行红色框内命令加入集群
    img.png

Worker节点加入集群

  • 本文采用Virtual Box搭建虚拟机环境,直接复制两个Worker Ubuntu虚拟机,修改hostname及静态ip
  • 执行kubeadm join xxx命令加入集群,若遇到localhost:8080 was refused报错,需要从Master节点同步kube配置文件到子节点,操作命令如下
# 复制admin.conf,请在master节点服务器上执行此命令:
scp /etc/kubernetes/admin.conf 192.168.112.175:/etc/kubernetes/admin.conf

# 然后在该工作节点上配置环境变量:
# 设置kubeconfig文件
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# 接下来,工作节点执行kubectl就正常了
  • 若遇到Port 10250 is in use报错,在kubeadm join命令末尾加入一行参数 –ignore-preflight-errors=Port-10250
  • 运行kubectl get nodes查看节点状态
root@k8s-node2:~# kubectl get no
NAME         STATUS   ROLES           AGE    VERSION
k8s-master   Ready    control-plane   171m   v1.27.1
k8s-node1    Ready    <none>          119m   v1.27.1
k8s-node2    Ready    <none>          36s    v1.27.1
root@k8s-node2:~# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
etcd-0               Healthy   {"health":"true","reason":""}   
scheduler            Healthy   ok                              
controller-manager   Healthy   ok                              
root@k8s-node2:~# kubectl get po -n kube-system
NAME                                 READY   STATUS    RESTARTS       AGE
coredns-5d78c9869d-72nqj             1/1     Running   1 (131m ago)   174m
coredns-5d78c9869d-j28vx             1/1     Running   1 (131m ago)   174m
etcd-k8s-master                      1/1     Running   1 (131m ago)   174m
kube-apiserver-k8s-master            1/1     Running   1 (131m ago)   174m
kube-controller-manager-k8s-master   1/1     Running   1 (131m ago)   174m
kube-proxy-b4g7j                     1/1     Running   1 (131m ago)   174m
kube-proxy-snk4w                     1/1     Running   0              3m56s
kube-proxy-t54c5                     1/1     Running   0              122m
kube-scheduler-k8s-master            1/1     Running   1 (131m ago)   174m
root@k8s-node2:~# kubectl get ns               
NAME              STATUS   AGE
default           Active   175m
kube-node-lease   Active   175m
kube-public       Active   175m
kube-system       Active   175m

CNI搭建

  • 本文提供两种安装方式,基本场景下使用flannel/calico就行,本文因需验证应用场景,选用Kube-OVN作为CNI插件。

1. Flannel

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
 
#将文件的docker.io镜像修改为docker.m.daocloud.io镜像,例如
image: docker.m.daocloud.io/flannel/flannel:v0.25.4
 
kubectl apply -f kube-flannel.yml

sudo su
 
 # root账号下,在/etc/cni/net.d/ 写入文件
 cat <<EOL > /etc/cni/net.d/10-flannel.conflist 
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
EOL
 
#重启服务
sudo systemctl restart containerd
sudo systemctl restart kubelet

1. Kube-OVN

至此,Kubernetes基本环境就搭建结束啦~