一、环境
K8S 版本 1.27.1 当前最新
Docker 版本 20.10.17 当前K8S支持的最大版本,参考官方文档
二、开始
1. 关闭防火墙
#禁用默认配置的iptables防火墙服务
ufw disable
#ufw查看当前的防火墙状态:inactive状态是防火墙关闭状态 active是开启状态。
ufw status
2. 禁用SELINUX
setenforce 0
sudo vim /etc/selinux/config
SELINUX=disabled
3. 禁用所有swap交换分区
sudo vim /etc/fstab
#/swap #永久禁用swap,删除或注释掉/etc/fstab里的swap设备的挂载命令即可
4. 配置多台主机 hosts
vim /etc/hosts
192.168.3.89 k8s-master
192.168.3.90 k8s-node1
192.168.3.91 k8s-node2
5. 重启
reboot
三、安装 Docker
安装教程链接: https://www.jianshu.com/p/c49fd0c19162
四、开始 K8S
1. (可选) 容器运行时配置: 转发 IPv4 并让 iptables 看到桥接流量
中文官网参考: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/
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
通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:
lsmod | grep br_netfilter
lsmod | grep overlay
2. (可选) 开启ipvs
在kubernetes中service有两种代理模型,一种是基于iptables(链表),另一种是基于ipvs(hash表)。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块,默认iptables
中文官网参考: https://kubernetes.io/zh-cn/docs/reference/networking/virtual-ips/
#安装ipset和ipvsadm:
apt install -y ipset ipvsadm
### 开启ipvs 转发
sudo modprobe br_netfilter
# 配置加载模块
cat > /etc/modules-load.d/ipvs.conf << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 临时加载
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 开机加载配置,将ipvs相关模块加入配置文件中
cat >> /etc/modules <<EOF
ip_vs_sh
ip_vs_wrr
ip_vs_rr
ip_vs
nf_conntrack
EOF
查看 ip_vs 是否加载进入内核中
lsmod | grep -e ip_vs -e nf_conntrack
3. 安装 containerd (在上面安装 Docker时,containerd 一并安装了)
sudo apt install docker-ce=5:20.10.173-0ubuntu-jammy docker-ce-cli=5:20.10.173-0ubuntu-jammy containerd.io (containerd.io 一并安装)
kubernetes 1.24版本彻底放弃Docker支持,弃用了kubelet中的docker-shim组件;也就是k8s不能默认直接使用docker引擎,所以必须安装一个额外的服务 cri-dockerd
containerd原本属于docker中一部分,如今成为一个独立容器运行并支持CRI(k8s容器接口),后来docker又把containerd捐献给CNCF基金会。
常见的CRI有:containerd、CRI-O、Docker Engine、Mirantis Container Runtime。
【在上面安装 Docker时,containerd 一并安装了,所以无需额外安装 containerd 只需要配置一些所需参数即可】
操作如下:
# 复制默认的配置 > config.toml 中
containerd config default > /etc/containerd/config.toml
# 编辑配置文件
vim /etc/containerd/config.toml
SystemdCgroup = false 改为 SystemdCgroup = true
# sandbox_image = "k8s.gcr.io/pause:3.6"
改为(3.6为版本,当前是多少,则保留多少,如果是3.8,下面则是3.8):
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
# 添加 endpoint 加速器, containerd配置下载镜像
# 找到这行配置 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
# 修改后( ttxrrkr1 为私有镜像, 我的ITian )
# 参考地址 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://ttxrrkr1.mirror.aliyuncs.com"]
#重新加载并重启containerd
systemctl daemon-reload && systemctl restart containerd
4. 安装k8s组件
安装kubeadm、kubelet、kubectl
# 配置阿里云镜像站点,(阿里镜像下载)也可以用官方方式下载
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat >/etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
# 查看版本
apt-cache madison kubeadm|head
![](https://img.haomeiwen.com/i14053484/9416df64ef725024.png)
# 安装指定版本
apt install -y kubeadm=1.27.1-00 kubelet=1.27.1-00 kubectl=1.27.1-00
5. 安装 master 节点, kubeadm init 初始化
# 生成默认配置,便于修改
kubeadm config print init-defaults > kubeadm.yaml
文件修改对应如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef # 可以自定义,正则([a-z0-9]{6}).([a-z0-9]{16})
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.3.89 # kubernetes主节点IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-matser # 节点的hostname
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 镜像仓库
kind: ClusterConfiguration
kubernetesVersion: 1.27.1 # 指定版本
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.1.0.0/16 # 增加指定pod的网段
scheduler: {}
---
# 使用ipvs
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
# 指定cgroup
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
使用文件配置方式初始化:
kubeadm init --config ./kubeadm.yaml
执行显示如下(下面这段,都复制出来保存):
![](https://img.haomeiwen.com/i14053484/d99d74fc9e07878f.png)
根据显示提示进行操作(要开始使用集群,需要以普通用户身份运行以下命令):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看命令
kubectl get nodes
#查看一下集群状态,确认个组件都处于healthy状态
kubectl get cs
kubectl get pod -n kube-system
6. master 配置安装网络组件 (calico 或者 flannel)
CNI(容器网络接口):这是K8s中提供的一种通用网络标准规范,因为k8s本身不提供网络解决方案。
目前比较知名的网络解决方案有: Flannel , Calico, AIC, Canal 等
可官网链接查看:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy
目前比较常用的时flannel和calico,flannel的功能比较简单,不具备复杂网络的配置能力,calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。
使用 calico 方式
calico 下载地址官网:
https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-etcd-datastore
# 使用calico 当前最新
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico-etcd.yaml -o calico.yaml
kubectl apply -f calico.yaml
使用 flannel 方式
# 使用flannel 当前最新
curl https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml -o kube-flannel.yml
kubectl apply -f kube-flannel.yml
检查网络配置
kubectl get pod -n kube-system
# 如果 coredns-xxxx 一直 ContainerCreating 中
kubectl describe pods -n kube-system coredns-xxxx
# 查看日志如果 open /run/flannel/subnet.env: no such file or directory
# 出现这种情况,检查和配置如下
vim /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
7. node 节点加入 (node 机器忽略 5步, 6步)
kubeadm join 192.168.3.89:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8472cdf57fb460fc6f448627e646046b8dc7506e3ac36438f50d5d00c2e1b0ef
五、遇到问题
1. 服务器断电重启后(apiserver出错)
![](https://img.haomeiwen.com/i14053484/5451aa65fca75528.png)
可以查看到 master节点 未找到
#查看kubelet的日志
journalctl -fu kubelet
解决方法:重新初始化集群
#master节点:
kubeadm reset -f
rm -rf $HOME/.kube
kubeadm init --config ./kubeadm.yaml
#node节点
kubeadm reset -f
rm -rf /etc/kubernetes/*
kubeadm join xxxxxxxxx...
2. Unable to connect to the server: x509: certificate signed by unknown authority )怎么解决
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
网友评论