7

Ubuntu 22.04 搭建K8s集群

 1 year ago
source link: https://www.cnblogs.com/way2backend/p/16970506.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文基于Mac平台和Parallels软件,在其中创建三个Ubuntu系统,搭建了一个3个节点(1个master和2个Node)的K8s集群。下面的步骤没有特殊说明,都是需要在所有节点上分别执行的。也可以在一个虚拟机上执行完之后,复制当前虚拟机作为其他节点。

1. 虚拟机基础配置

基于Parallels虚拟机软件,在其中安装三个ubuntu系统,后续用于创建K8s集群的master节点和两个Node节点,三个节点均采用静态ip,具体配置如下:

  • Master节点:192.168.31.200 master

  • Node1节点:192.168.31.201 node1

  • Node2节点:192.168.31.202 node2

配置静态ip

需要在三个节点上分别配置,下面以master为例:

008vxvgGgy1h8xtx8sdx3j31a40u0wh5.jpg

修改虚拟机网络为桥接模式:

008vxvgGgy1h8xumjf4s4j31co0ektbb.jpg

设置主机名

在Master节点运行

sudo hostnamectl set-hostname master

其他节点分别运行

sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2

设置hosts

方便节点之间相互访问,在每个节点的/etc/hosts上添加如下配置:

192.168.31.200 master
192.168.31.201 node1
192.168.31.202 node2

配置好之后,试下ping master、node1看能否正常访问。

安装ssh

安装ssh,方便后续连接到虚拟机执行cmd。

sudo apt update

sudo apt install openssh-server

sudo systemctl status ssh

# 如果遇到防火墙的问题,可以尝试下面的command来允许ssh。

sudo ufw allow ssh

后续为了方便在多个terminal同时输入command,可以使用iterm同时打开三个窗口,然后输入cmd + shift + I进入多个输入的模式,如果需要退出,可以输入⌘Command + ⇧Shift + ⌥Option + I

2. Ubuntu系统设置

禁用swap

sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

这步之后,最好重启ubuntu系统保证修改生效。

修改内核参数

载入如下内核模块,

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

相关资料参考:

配置下面的网络参数:

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

运行下面的command使改动生效:

sudo sysctl --system

3. 安装containerd

Docker,Kubernetes 等工具来运行一个容器时会调用组件(CRI)比如 containerd,CRI-O来来完成容器的创建、运行、销毁等实际工作。Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 containerd,CRI-O等,这些组件都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行。

他们之间的相互关系如下:

image-20221209223024990

具体安装步骤如下:

  • 安装dependencies:
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
  • 添加docker repo:
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 安装containerd
sudo apt update
sudo apt install -y containerd.io
  • 配置containerd使用systemd作为cgroup
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  • 重启并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd

4. 安装Kubernetes组件

添加apt repo

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

安装Kubectl, kubeadm & kubelet

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

apt-mark 用于将软件包标记/取消标记为自动安装。 hold 选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除。这里主要是为了防止kubelet等组件自动升级。

5. 初始化Master节点

这步需要在Master节点进行设置,运行如下的节点初始化整个k8s集群。

sudo kubeadm init --control-plane-endpoint=192.168.31.200

当看到如下的输出时,说明系统master节点初始化完成。

image-20221209224223297

接着按照提示信息,进行后续的初始化工作:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

完成上面的工作之后,可以尝试运行下面的command来查看当前集群的状态:

kubectl cluster-info
kubectl get nodes

输入类似如下

image-20221209224426382

6. 加入Node节点

在master节点的初始化输出的最下面,会列出node节点加入的command,直接copy然后到每个node节点运行即可。下面是个例子,得换成实际的command,

sudo kubeadm join 192.168.31.200:6443 --token mjy0xx.95lsse7r7fw5sb00 
--discovery-token-ca-cert-hash sha256:73b92db9baf19a3e14d679e6d44b5c7a804902d6ffa3d170858d2ccfd5e0c93f

加入成功之后,可以查看当前集群的node状态,此时由于没有安装网络相关插件,所有节点出于NotReady的状态。下一步会进行安装。

kubectl get nodes

image-20221209224649419

7. 配置集群网络

一般可以安装Calico、Flannel和Weave-net等插件,下面以Calico为例进行操作。

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml

输出结果大概如下:

image-20221209224937176

此时可以查看系统namespace下的所有基础组件的运行情况,

kubectl get pods -n kube-system
image-20221209225133515

接下来检查节点状态:

kubectl get nodes
image-20221209225224831

至此,整个k8s集群搭建完毕, 下面可以进行一些基本测试。

8. 测试K8s集群

这里部署了一个nginx的app来进行测试,

kubectl create deployment nginx-app --image=nginx --replicas=2

查看nginx的状态:

kubectl get deployment nginx-app

将deployment暴露出去,采用NodePort的方式(这种方式会在每个节点上开放同一个端口,外部可以通过节点ip+port的方式进行访问)

kubectl expose deployment nginx-app --type=NodePort --port=80

可以检查service的状态,

kubectl get svc nginx-app
kubectl describe svc nginx-app
image-20221209225542880

下面是测试结果:

image-20221209230257244

说明Nginx运行正常,整个k8s节点部署成功。



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK