kubernetes集群搭建

igxiaoshan Lv5

K8s集群部署

官方文档

kubeadm搭建集群

环境配置

  • 一台兼容的Linux主机;kubernetes项目是基于DebianRed Hat的Linux发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器2GB或者更多的 RAM(过小会影响应用的运行内存)
  • 2 CPU核或者更多
  • 集群中所有机器的网络彼此均能互相连接(公网和内网都可以)
    • 设置防火墙规则
  • 节点之间不可以有重复的主机名,MAC地址product_uuid
  • 开启机器上的某些端口
    • 内网互信
    • 6443端口
  • 禁用交换分区;为了保证kubelet正常工作,必须禁用交换分区
    • 永久关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
### 环境检查
#### 查看发行版本
cat /etc/os-release

#### 查看内核版本
uname -r

#### 查看RAM大小
free -h / top / cat /proc/meminfo

#### 查看CPU核数
nproc / lscpu(详细版)

#### 查看网络接口的 MAC 地址
ip link / ifconfig -a ## MAC 通常出现在 'ether' 后面 如: ether 00:0c:29:40:cf:8f

#### 查看 product_uuid
sudo cat /sys/class/dmi/id/product_uuid

#### 检查所需端口
##### 使用 netcat 工具检查端口是否启动
nc 127.0.0.1 6443
##### 安装 netcat 工具
yum install nc -y

#### 查看主机名和设置主机名
hostname
hostnamectl set-hostname [主机名]

#### 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#### 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

#### 允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

安装kubelet,kubeadm,kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF


sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

下载各个机器需要的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/igsshansz/$imageName
done
EOF

chmod +x ./images.sh && ./images.sh


###### 清空镜像
sudo tee ./delete_images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker rmi registry.cn-hangzhou.aliyuncs.com/igsshansz/$imageName
done
EOF

chmod +x ./delete_images.sh && ./delete_images.sh

初始化主节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
## 所有机器添加master域名映射
echo "192.168.107.21 cluster-endpoint" >> /etc/hosts

### 作用: 集群中使用自定义的域名解析。这是因为 Kubernetes 集群中的各个组件通常需要通过集群的 API 服务器(cluster-endpoint)进行通信,而直接使用 IP 地址可能不够方便,尤其是在涉及多节点的集群中。


## 初始化主节点
kubeadm init \
--apiserver-advertise-address=192.168.107.21 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

### 保证所有网络不重叠
--service-cidr=10.96.0.0/16
--pod-network-cidr=192.168.0.0/16


### 初始化成功
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 cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \
--discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88 \
--control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \
--discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88

要使用非 root 用户可以运行 kubectl ,请运行一下命令,它们也是kubeadm init输出的一部分

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

如果你是root用户,则可以运行

1
export KUBECONFIG=/etc/kubernetes/admin.conf

警告:

kubeadm 对 admin.conf 中的证书进行签名时,将其配置为 Subject: O = system:masters, CN = kubernetes-adminsystem:masters 是一个例外的、超级用户组,可以绕过鉴权层(例如 RBAC)。 不要将 admin.conf 文件与任何人共享,应该使用 kubeadm kubeconfig user 命令为其他用户生成 kubeconfig 文件,完成对他们的定制授权。 更多细节请参见为其他用户生成 kubeconfig 文件

  • 记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将节点加入集群
  • 如果需要重新生成新的令牌执行: kubeadm token create --print-join-command

安装 Pod 网络附加组件

你必须部署一个基于 Pod 网络插件的容器网络接口(CNI), 以便你的 Pod 可以相互通信。在安装网络之前,集群 DNS (CoreDNS) 将不会启动。

calico官网

1
2
3
4
5
### 下载calico网络
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

### 安装calico网络
kubectl apply -f calico.yaml

每个集群只能安装一个 Pod 网络。

安装 Pod 网络后;可以通过在kubectl get pods --all-namespaces输出中检查 CoreDNS Pod 是否running来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。

加入节点

1
2
kubeadm join cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \
--discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88

默认情况下,令牌会是在24小时后过期

如果过期了,需要重新生成令牌

集群搭建遇到的问题