欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

安装 K8S 1.27.1 在 Ubuntu22.04 上

最编程 2024-08-14 18:43:44
...

一、环境

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
image.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 

执行显示如下(下面这段,都复制出来保存):


image.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出错)
Image 1.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