时间:2022.9.21
版本:v1.25.0
说明:默认安装步骤在每个服务器都需要执行,单独安装会注明

一、安装kubeadm

要求:

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
  • CPU 2 核心及以上。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名MAC 地址或 product_uuid
`一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。`
  • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
ip link

k8s下载容器里面的jar包 k8s最新版本安装_docker

  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
sudo cat /sys/class/dmi/id/product_uuid
  • 开启机器上的某些端口(如果你的公司已经有了统一的安全防护,内网可以直接关闭防火墙)。
  • 控制面板服务器(就是提供api的那个,通常就是master)

协议

方向

端口范围

目的

使用者

TCP

入站

6443

Kubernetes API server

所有

TCP

入站

2379-2380

etcd server client API

kube-apiserver, etcd

TCP

入站

10250

Kubelet API

自身, 控制面

TCP

入站

10259

kube-scheduler

自身

TCP

入站

10257

kube-controller-manager

自身

  • 各个工作节点

协议

方向

端口范围

目的

使用者

TCP

入站

10250

Kubelet API

自身, 控制面

TCP

入站

30000-32767

NodePort Services†

所有

  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
swapoff -a



1、安装容器运行时(我们安装containerd作为运行时)

常用的有三个容器运行时供你选择
  • containerd(推荐
  • cri-o
  • docker engine(using cri-dockerd)(不要再使用,自v1.24版本后已经不再支持)


1.1、安装前的配置

1.1.1、转发 IPv4 并让 iptables 看到桥接流量
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

运行以下命令查看是否成功配置

lsmod | grep br_netfilter


1.2、安装containerd容器运行时

官方提供了三种安装方式

  • 来自官方的二进制文件
  • 1.安装containerd
  • 2.安装runc
  • 3.安装CNI plugins
  • 使用apt-get or dnf(详见docker官方文档)
  • 从源码安装(一般人应该不会采用这种方式,所以这里就不讲了
1.2.1、通过官方二进制文件的方式安装
  • 安装containerd
tar Cxzvf /usr/local containerd-1.6.2-linux-amd64.tar.gz
bin/
bin/containerd-shim-runc-v2
bin/containerd-shim
bin/ctr
bin/containerd-shim-runc-v1
bin/containerd
bin/containerd-stress
  • 下载containerd.service 将下载下来的文件放到/usr/local/lib/systemd/system/containerd.service
  • 使服务生效
systemctl daemon-reload
systemctl enable --now containerd
  • 生成默认配置文件、并修改配置、重启服务
#创建文件夹
mkdir -p /etc/containerd
#生成默认配置文件
containerd config default > /etc/containerd/config.toml
#因为k8s.gcr.io国内不能访问修改k8s.gcr.io为registry.aliyuncs.com/google_containers
sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
#如果使用systemd cgroup驱动,需要做此配置
#[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
#   SystemdCgroup = false将false改成true
vim /etc/containerd/config.toml

#重启containerd
systemctl restart containerd
systemctl enable containerd
#查看containerd状态
systemctl status  containerd
  • 安装runc
install -m 755 runc.amd64 /usr/local/sbin/runc
  • 安装CNI plugins
$ mkdir -p /opt/cni/bin
$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
./
./macvlan
./static
./vlan
./portmap
./host-local
./vrf
./bridge
./tuning
./firewall
./host-device
./sbr
./loopback
./dhcp
./ptp
./ipvlan
./bandwidth

1.3、安装kubeadm、kubelet和kubectl(公司内网限制采用先下载安装包的方式)

kubedm依赖crictl、kubernetes-cni、cri-tools、kubectl、kubelet,所以最后执行kubeadm的安装
例如,安装cri-tools:

dpkg -i cri-tools_1.24.2-00_amd64_8ce48ca39ead11b4b3ba109d57439f9024e6e53bb3261ba75466d403542a5908.deb



此时安装步骤已经完成,接下来进行kubeadm的初始化




二、使用kubeadm创建集群(在任意一台master上执行

生成初始化集群的配置文件

kubeadm config print init-defaults > kubeadm-conf.yaml

注意修改文件的一部分

vim kubeadm-conf.yaml
#以下为kubeadm-conf.yaml的内容
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  #值为你本机的ip地址,一定是ip地址,ipv4或者ipv6都行
  advertiseAddress: 10.96.0.147
  bindPort: 6443
nodeRegistration:
  #生成的默认值可能是unix:///var/run/containerd/containerd.sock请注意修改没有前面的/var
  criSocket: unix:///run/containerd/containerd.sock
  #这个值的可选项为Always、IfNotPresent、Never,如果你有网络连接,可以配置成Always,IfNotPresent,如果没有网络连接请配置成IfNotPresent或者Never,因为我们需要提前准备镜像,所以默认值IfNotPresent即可,别修改
  imagePullPolicy: IfNotPresent
  #这个是你当前主机的hostname
  name: k8s-master-a
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
#如果仅有国内网络访问,请修改成阿里的镜像:registry.aliyuncs.com/google_containers
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

1、准备需要的镜像(可以连接外网的可以忽略这步

1.1、 查看需要哪些镜像

#查看需要的镜像
kubeadm config images list --config kubeadm-conf.yaml

k8s下载容器里面的jar包 k8s最新版本安装_kubernetes_02

1.2、下载需要的镜像

虽然不能直接连接外网,但是公司配有阿里的docker镜像服务,所以我们先用docker下载下来镜像

请确保你的代理镜像有代理到registry.aliyuncs.com,并且给你当前服务器上的docker做代理镜像配置

如果你使用的Nexus请确保有Repositories代理阿里镜像地址

k8s下载容器里面的jar包 k8s最新版本安装_linux_03


k8s下载容器里面的jar包 k8s最新版本安装_docker_04


执行docker pull将镜像下载到本地

docker pull docker镜像服务器地址:端口号/google_containers/kube-apiserver:v1.25.0
docker pull docker镜像服务器地址:端口号/google_containers/kube-controller-manager:v1.25.0
docker pull docker镜像服务器地址:端口号/google_containers/kube-scheduler:v1.25.0
docker pull docker镜像服务器地址:端口号/google_containers/kube-proxy:v1.25.0
docker pull docker镜像服务器地址:端口号/google_containers/pause:3.8
docker pull docker镜像服务器地址:端口号/google_containers/etcd:3.5.4-0
docker pull docker镜像服务器地址:端口号/google_containers/coredns:v1.9.3

注意:这里的镜像名称要与kubeadm config images list --config kubeadm-conf.yaml的名称保持一致
所以如果不一致,1.可以配置成一致,只需要你在kubeadm-conf.yaml中的imageRepository: docker镜像服务器地址:端口号/google_containers即可,2.你也可以进行docker tag来重新命名来保持一致,如:

docker tag docker镜像服务器地址:端口号/google_containers/kube-apiserver:v1.25.0    register.aliyuncs.com/google_containers/kube-apiserver:v1.25.0

1.3、将镜像导入到containerd中

因为我们k8s安装的运行时是containerd,所以,将镜像导入到containerd中

1.3.1、将上一步中的镜像打包

注意:这里的docker镜像服务器地址:端口号也可能是register.aliyuncs.com或其他名字,取决于你上一步是如何做到镜像名称与kubeadm-conf.yaml中的imageRepository保持一致

docker save docker镜像服务器地址:端口号/google_containers/kube-apiserver:v1.25.0          > kube-apiserver.tar
docker save docker镜像服务器地址:端口号/google_containers/kube-controller-manager:v1.25.0 > kube-controller-manager.tar
docker save docker镜像服务器地址:端口号/google_containers/kube-scheduler:v1.25.0          > kube-scheduler.tar
docker save docker镜像服务器地址:端口号/google_containers/kube-proxy:v1.25.0              > kube-proxy.tar
docker save docker镜像服务器地址:端口号/google_containers/pause:3.8                       > pause.tar
docker save docker镜像服务器地址:端口号/google_containers/etcd:3.5.4-0                    > etcd.tar
docker save docker镜像服务器地址:端口号/google_containers/coredns/coredns:v1.9.3          > coredns.tar
1.3.2、将镜像导入到containerd

注意:-n k8s很重要,k8s默认使用的命名空间是k8s.io,如果不加就使用不了

ctr -n k8s.io image import kube-apiserver.tar
ctr -n k8s.io image import kube-controller-manager.tar
ctr -n k8s.io image import kube-scheduler.tar
ctr -n k8s.io image import kube-proxy.tar
ctr -n k8s.io image import pause.tar
ctr -n k8s.io image import etcd.tar
ctr -n k8s.io image import coredns.tar


2、执行主节点初始化操作

2.1、执行初始化

kubeadm init --config kubeadm-conf.yaml --v=5
	·
	·
	·
#下面为该命令的输出最后一部分,这部分请保留,接下来的操作需要用到
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join k8s-master-a:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:b5e2ec275d04bf57ad10c867d511b7d9b413191f92c228b4387568ae157d75a9 \
        --control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-master-a:6443 --token 5didvk.d09sbcov8ph2amjw \
        --discovery-token-ca-cert-hash sha256:b5e2ec275d04bf57ad10c867d511b7d9b413191f92c228b4387568ae157d75a9

如果你是普通用户操作的:请执行以下命令

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果你是root用户:

export KUBECONFIG=/etc/kubernetes/admin.conf

查看集群状态

kubectl cluster-info

2.2、添加其他主节点

在其他主节点上使用root身份执行:

kubeadm join k8s-master-a:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:b5e2ec275d04bf57ad10c867d511b7d9b413191f92c228b4387568ae157d75a9 \
        --control-plane

2.3、 安装Pod网络附加组件

请参阅