版本统一
kubeadm:v1.23.14
kubelet:v1.23.14
kubectl:v1.23.14
---
k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6
---
calico:v3.20
---
docker:v20.10.7
集群规划
节点IP | 主机名 | 角色 |
---|---|---|
172.24.253.248 | k8s-master | master |
172.24.133.28 | k8s-node1 | worker |
172.24.133.29 | k8s-node2 | worker |
系统基础前提配置
在三个节点上都要操作
- 更新并安装依赖
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
- 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
- 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
- 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
- 设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
修改集群节点的host文件
- 修改172.24.253.248节点的主机名
sudo hostnamectl set-hostname k8s-master
- 修改172.24.133.28节点的主机名
sudo hostnamectl set-hostname k8s-node1
- 修改172.24.133.29节点的主机名
sudo hostnamectl set-hostname k8s-node2
- 三个节点上都操作
vim /etc/hosts
172.24.253.248 k8s-master
172.24.133.28 k8s-node1
172.24.133.29 k8s-node2
安装Docker
在三个节点上都要操作
- 安装必要的依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 设置阿里云镜像仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io
- 启动docker,并设置开机启动
sudo systemctl start docker && sudo systemctl enable docker
安装kubeadm,kubelet和kubectl
在三个节点上都要操作
- 配置kubernetes的yum源
cat <<EOF > /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
EOF
- 列出可以安装的版本
yum list kubeadm --showduplicates | sort -r
- 安装kubectl
yum install -y kubectl-1.23.14
- 安装kubelet
yum install -y kubelet-1.23.14
- 安装kubeadm
yum install -y kubeadm-1.23.14
- 查询安装
yum list installed | grep kube
- docker和k8s设置同一个cgroup
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
下载镜像
- 查看kubeadm使用的镜像
kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6
- 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
vim kubeadm-pull-image.sh
#!/bin/bash
set -e
KUBE_VERSION=v1.23.14
KUBE_PAUSE_VERSION=3.6
ETCD_VERSION=3.5.5-0
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/jack-kubernetes
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
- 脚本添加可执行权限
chmod 775 kubeadm-pull-image.sh
- 运行脚本
sh ./kubeadm-pull-image.sh
- 拉取coredns镜像
docker pull registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6
docker tag registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
docker rmi registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6
- 查看镜像
docker images
初始化master
在k8s-master节点上执行
- 使用kubeadm init命令初始化master
kubeadm init --kubernetes-version=1.23.14 --apiserver-advertise-address=172.24.253.248 --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看是否成功
kubectl cluster-info
kubectl get pods -n kube-system
- 健康检查
curl -k https://localhost:6443/healthz
kube join
- k8s-node1和k8s-node2两个节点上运行
kubeadm join 172.24.253.248:6443 --token v61qjw.l8l1lnn4q0wjnea4 \
--discovery-token-ca-cert-hash sha256:750922612646bf4dda3640cfe3bc90145a52a59c89a32742290f22151b31576a
此命令来自上面一步初始化master成功之后输出的
- 在k8s-master节点上检查集群信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 36h v1.23.14
k8s-node1 Ready <none> 36h v1.23.14
k8s-node2 Ready <none> 36h v1.23.14
部署calico网络插件
- 提前拉取calico镜像
docker pull docker.io/calico/kube-controllers:v3.20.3
docker pull docker.io/calico/pod2daemon-flexvol:v3.20.3
docker pull docker.io/calico/node:v3.20.3
docker pull docker.io/calico/cni:v3.20.3
- 在k8s-master中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml
- 确认一下calico是否安装成功
kubectl get pods --all-namespaces -o wide
添加和删除Pod
- 定义pod.yml文件,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOF
- 根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml
- 查看所有pod的信息
kubectl get pods
- 查看所有pod的详情信息
kubectl get pods -o wide
- 查看指定pod的详情信息
kubectl describe pod nginx
- 通过rs将pod扩容
kubectl scale rs nginx --replicas=5
- 删除pod
kubectl delete -f pod_nginx_rs.yaml
重建集群
- 在k8s-master节点上操作
kubeadm reset
rm -rf /etc/kubernetes
rm -rf $HOME/.kube
- 在k8s-node1和k8s-node2节点上操作
rm -rf /etc/kubernetes
rm -rf /var/lib/kubelet/pki/kubelet-client*
systemctl stop kubelet
- 使用上面的步骤重新初始化集群
常见问题
问题描述 | 原因 | 解决方案 |
---|---|---|
dial tcp 127.0.0.1:10248: connect: connection refused |
docker和k8s没有设置同一个cgroup | 将docker和k8s的cgroup都设置为systemd |
Failed to list *v1.Pod: Unauthorized |
没有权限 | rm -rf /var/lib/kubelet/pki/kubelet-client* |
kubeadm init流程
- 进行一系列检查,以确定这台机器可以部署kubernetes
- 生成kubernetes对外提供服务所需要的各种证书可对应目录/etc/kubernetes/pki/*
- 为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
- 为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
- 生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml
- 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
- 为集群生成一个bootstrap token
- 将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,供后续部署node节点使用
- 最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的
评论区