记录一下:从零搭建Kubernetes集群踩坑记录

前言

搭建一个测试集群。虽然之前都是学过一些理论和自己电脑操作过,但真正动手还是第一次,踩了不少坑,记录一下。

环境规划

角色

主机名

ip

配置

系统

Master

k8s-master

172.16.0.10

4C8G

CentOS7.9

Node1

k8s-node1

172.16.0.11

4C8G

CentOS7.9

Node2

k8s-node2

172.16.0.12

4C8G

CentOS7.9

版本选择:

  • Kubernetes:1.24.6

  • Docker: 20.10.21

  • Calico: 3.24.0

准备工作

  1. 所有节点的基础配置

# 关闭防火墙
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
  1. 配置内核参数

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
  1. 安装 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 组件

  1. 配置 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
  1. 安装 kubeadm、kubelet、kubectl

yum install -y kubelet kubeadm kubectl

# 设置开机自启(先不启动,等初始化后)
systemctl enable kubelet

初始化 Master 节点

  1. 提前拉取镜像

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
  1. 初始化集群

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-addressMaster 的 IP

  • --pod-network-cidrPod 网段,要和后面的 Calico 配置一致

  1. 配置 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 通,说明跨节点网络没问题

后续安装

  1. 安装 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
  1. 安装 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
  1. 配置 kubectl 自动补全

yum install -y bash-completion
kubectl completion bash > /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl

这次搭建用了一整天,主要是各种踩坑调试。现在集群跑起来了,后面就可以开始部署应用了。

下一步计划学习Helm、Ingress、持久化存储这些。慢慢来吧,K8s的东西太多了。


上一篇 记录一下:Redis Sentinel 哨兵机制详解与故障转移实践
下一篇 记录一下:MySQL 主从复制与 GTID 模式详解