准备阶段
规划节点
准备linux服务器(配置随意,不能小于2C/2G 😜),规划哪些服务器作为master节点,那些作为node节点。
我准备了4台服务器,一台作为master节点,2台作为node节点,有一台不加入集群的服务器作为部署节点。
[!tip]
部署节点不是必须的,集群中的任何节点都可以执行部署操作
节点名字(可选)
给每个节点起名字,然后将其配置到每个服务器的 /etc/hosts
[!tip]
默认Pod不会调度到master节点,只会在node节点调度
下载安装包
containerd
- containerd-releases :
从github现在最新release版本 - containerd.service 文件
- go.mod
runc
cni-plugin
cilium
hlem
go
k9s
安装组件
所有节点(服务器)都需要进行下列操作
[!tip]
有条件的使用root
用户进行下列操作,非root用户也是可以的,只是我是使用root进行的操作
install go
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz
- 添加
export PATH=$PATH:/usr/local/go/bin
到/etc/profile
source /etc/profile
go version
执行下列命令
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz
配置环境变量,添加下列内容到 /etc/profile
export PATH=$PATH:/usr/local/go/bin
执行下列命令使环境变量生效
source /etc/profile
验证
go version
install go mod
[!attention]
我不懂GO,所以containerd go mod我是直接从github下载文件放到了go的目录中 😅
mkdir -p /usr/local/go/bin/src/github.com/containerd/containerd/
cp go.mod /usr/local/go/bin/src/github.com/containerd/containerd/
install containerd
解压[[#containerd|准备阶段]] 下载的 containerd-x.x.x-llinux-amd64.tar.gz
解压到 /usr/local
目录
tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz
install runc
通过下列命令将[[#runc#|准备阶段]] 下载的runc.<ARCH>
安装到/user/sbin/
目录
install -m 755 runc.amd64 /usr/sbin/runc
install CNI plugin
通过下列命令将[[#cni-plugin|准备阶段]] 下载的 cni-plugins-xxx-xxx-vxxxx.tgz
解压到 /opt/cni/bin
目录
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
install kubeadm、kubelet 和 kubectl
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
进行配置
关闭swap
编辑 /etc/fstab
注释 swap 行
配置iptables
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe 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.service
将[[#准备阶段#containerd#|准备阶段]] 下载的containerd.service
文件复制到/usr/lib/systemd/system/
,然后执行下列命令:
systemctl daemon-reload
systemctl enable --now containerd
配置containerd
配置containerd.service
将[[#准备阶段#containerd#|准备阶段]] 下载的containerd.service
文件复制到/usr/lib/systemd/system/
,然后执行下列命令:
systemctl daemon-reload
systemctl enable --now containerd
通过下面命令生成containerd默认配置文件
containerd config default > /etc/containerd/config.toml
[!tip]
遇到no such file or directory: /etc/containerd/config.toml
报错,通过下列命令创建目录mkdir -p /etc/containerd/
遇到
command not found: containerd
,查询containerd
位置whereis containerd
结果输出
containerd: /usr/local/bin/containerd
,将输出目录添加到$PATH
配置国内镜像源
修改 /etc/containerd/config.toml
文件
修改sandbox_image的镜像
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
修改registry的镜像源
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://xxxxxx.mirror.aliyuncs.com", "https://registry-1.docker.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["registry.aliyuncs.com/google_containers"]
[!tip]
xxxx.mirror.aliyuncs.com 需要到阿里云注册获取,每个帐号有一个独立的地址。
配置 systemd
cgroup 驱动
在 /etc/containerd/config.toml
中设置 SystemdCgroup
为 true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
重启 congtainerd.service
sudo systemctl restart containerd
初始化CNI
执行[[#cni-plugin|准备阶段]] 下载的初始化cni的脚本
启动阶段
master节点
初始化集群
[!tip]
如果规划的master节点有多个,只需要在第一个master节点进行初始化
通过下列命令初始化节点
kubeadm init \
--control-plane-endpoint=<domain name> \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--token= <token> \
--token-ttl=0 \
--apiserver-advertise-address=<master ip> \
--pod-network-cidr=10.0.0.0/16 \
--node-name=master
[!note]
--control-plane-endopoint
: 配置control plane的域名,如果没有配置dns,需要在每个服务器上配置/etc/hosts
--image-repository
: 镜像源地址,我使用的阿里云的源
--token
:配置集群的token,其他节点加入集群的时候使用, 格式: “[a-z0-9]{6}.[a-z0-9]{16}” 不使用此参数会自动生成一个
--token-ttl
: token过期时间(例如 1 s,2 m,3 h),默认为 24h0m0s。如果设置为 ‘0’,则令牌将永不过期。
--apiserver-advertise-address
: master 节点的IP地址
--pod-nwework-cidr
这个是配置集群内部使用的网段
--node-name
节点的名字(可以不添加此参数,默认为服务器的hostname)
命令执行成功之后会有如下输出
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:
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join <domain name>:6443 --token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join <domain name>:6443 --token <token> \
--discovery-token-ca-cert-hash <sh256>
[!tip]
输出中的jion命令,带有--control-plane
参数的是添加master节点(管理节点)到集群中,另一个为添加node节点(work节点)到集群中。
生成cluster config文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
node节点
通过下列命令把node节点加入集群
kubeadm join \
<master domin name>:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash256> \
--node-name=node1
[!tip]
<master domain name>
: 初始化集群的时候配置的--control-plane-endopoint
参数的值
--token
: 初始化集群配置的token,直接复制初始化集群之后的输出内容中的 token使用即可
--discovery-token-ca-cert-hash
: 直接复制初始化集群之后的输出内容中的 hash使用即可
--node-name
: 节点的名字(可以不添加此参数,默认为服务器的hostname)
配置部署节点
copy cluster config文件到部署节点
mkdir -p $HOME/.kube
cp config $HOME/.kube/
[!tipe]
config文件来自master节点,目录在执行初始化集群操作的用户的$HOME/.kube/
目录
如果选择在执行初始化集群命令的服务器上进行部署操作,可以跳过这步。
如果选择在其他节点的服务器上进行部署操作,需要执行此步
install kubectl
参考 [[#install kubeadm、kubelet 和 kubectl|安装组件]] 安装kubectl
install helm
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
[!tip]
有些虚机可能没有将/usr/local/bin
目录加入到$PATH
install k9s
- 解压
- copy k9s to /usr/local/bin
部署应用
网络组件
install cilium
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
cilium install
查看一下状态
cilium status
测试用例
部署busybox
创建一个 busybox.yaml
文件,将下列内容写入文件中
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: busybox
labels:
app: guestbook
tier: busybox
spec:
replicas: 2
selector:
matchLabels:
tier: busybox
template:
metadata:
labels:
tier: busybox
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
执行下列命令,部署busybox到集群中
kubectl apply -f busybox.yaml
检查集群状态
通过k9s查看并测试集群
执行命令,进入k9s界面。
k9s
查看节点状态
按 ESC
,然后 按 :
,然后输入 node
, 然后按 Enter
。 然后看看 STATUS
列是否都是 Ready
。
查看 Pod状态
进入k9s之后,按:
,然后输入 pods
,然后按 enter
, 然后按 0
,就可以看到类似下面的内容. 查看 READY
和 STATUS
是否正常。
[!info]
k9s的详细操作,可以参考官网.
检查集群内部网络
通过方向键选中 busybox
的pod,NAME以 busybox
开头。然后按 S
进入pod shell。 (需要提前记录一下另一个 busybox的 IP)
[!tip]
IP
列展示的是Pod在集群内部的IP地址
ping 10.0.0.44 -c 4
PING 10.0.0.44 (10.0.0.44): 56 data bytes
64 bytes from 10.0.0.44: seq=0 ttl=63 time=0.974 ms
64 bytes from 10.0.0.44: seq=1 ttl=63 time=0.684 ms
64 bytes from 10.0.0.44: seq=2 ttl=63 time=0.702 ms
64 bytes from 10.0.0.44: seq=3 ttl=63 time=0.659 ms
--- 10.0.0.44 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss