记录一下:从零搭建Kubernetes集群踩坑记录
前言
搭建一个测试集群。虽然之前都是学过一些理论和自己电脑操作过,但真正动手还是第一次,踩了不少坑,记录一下。
环境规划
版本选择:
Kubernetes:1.24.6
Docker: 20.10.21
Calico: 3.24.0
准备工作
所有节点的基础配置
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 关闭swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 配置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
# 配置hosts
cat >> /etc/hosts << EOF
172.16.0.10 k8s-master
172.16.0.11 k8s-node1
172.16.0.12 k8s-node2
EOF
# 时间同步
yum install -y ntpdate
ntpdate time.windows.com
配置内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加载br_netfilter模块
modprobe br_netfilter
# 使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
坑1:如果不加载br_netfilter
模块,后面会报错
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
安装 Docker
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker
yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io
# 配置Docker
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 启动Docker
systemctl daemon-reload
systemctl enable docker
systemctl start docker
# 验证
docker version
安装 K8s 组件
配置 K8s 仓库
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
EOF
安装 kubeadm、kubelet、kubectl
yum install -y kubelet kubeadm kubectl
# 设置开机自启(先不启动,等初始化后)
systemctl enable kubelet
初始化 Master 节点
提前拉取镜像
kubeadm config images list --kubernetes-version=v1.24.6
# 写个脚本从阿里云拉镜像
cat > pull_images.sh << 'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.24.6
kube-controller-manager:v1.24.6
kube-scheduler:v1.24.6
kube-proxy:v1.24.6
pause:3.7
etcd:3.5.3-0
coredns:v1.8.6
)
for img in ${images[@]}; do
docker pull registry.aliyuncs.com/google_containers/$img
docker tag registry.aliyuncs.com/google_containers/$img k8s.gcr.io/$img
docker rmi registry.aliyuncs.com/google_containers/$img
done
EOF
chmod +x pull_images.sh
./pull_images.sh
CoreDNS 的镜像名字有坑,阿里云是
coredns:v1.8.6
,但 K8s 要的是coredns/coredns:v1.8.6
,需要手动 tag
docker tag k8s.gcr.io/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
初始化集群
kubeadm init \
--apiserver-advertise-address=172.16.0.10 \
--kubernetes-version=v1.24.6 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address
Master 的 IP--pod-network-cidr
Pod 网段,要和后面的 Calico 配置一致
配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 验证
kubectl get nodes
安装 Calico
wget https://docs.projectcalico.org/v3.24/manifests/calico.yaml
vi calico.yaml
# 修改 CALICO_IPV4POOL_CIDR
- name: CALICO_IPV4POO_CIDR
value: "10.244.0.0/16"
kubectl apply -f calico.yaml
如果 Calico 的 Pod 一直是
Init:ImagePullBackOff
,说明镜像拉取失败,需要手动拉取
Node 节点加入集群
在 node1 和 node2 上执行之前保存的kubeadm join
命令
如果忘了,可以在 Master 上重新生成
kubeadm token create --print-join-command
功能测试
1. 部署一个 Nginx
kubectl create deployment nginx --image=nginx:1.20
kubectl expose deployment nginx --port=80 --type=NodePort
使用kubectl get svc
查看端口,访问任意节点的 30123 端口
curl https://172.16.0.11:30123
2. 跨节点通信
# 扩容到3个副本
kubectl scale deployment nginx --replicas=3
# 查看Pod分布
kubectl get pods -o wide
# 进入一个Pod,ping另一个Pod
kubectl exec -it nginx-xxx -- bash
ping 10.244.2.11
能 ping 通,说明跨节点网络没问题
后续安装
安装 Dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
# 修改Servicce类型为NodePort
vi recommended.yaml
# 找到 kind: Service, 添加 type: NodePort
kubectl apply -f recommended.yaml
# 获取访问端口
kubectl get svc -n kubernetes-dashboard
安装 Merics Server
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改配置(测试环境跳过证书验证)
vi components.yaml
# 在 args 下添加
- --kubelet-insecure-tls
kubectl apply -f components.yaml
# 验证
kubectl top nodes
kubectl top pods
配置 kubectl 自动补全
yum install -y bash-completion
kubectl completion bash > /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl
这次搭建用了一整天,主要是各种踩坑调试。现在集群跑起来了,后面就可以开始部署应用了。
下一步计划学习Helm、Ingress、持久化存储这些。慢慢来吧,K8s的东西太多了。