前言
此文档用于安装kubernetes,当前使用虚拟机进行模拟生产环境。

一、安装环境

** 主机信息 **
kube-master  192.168.10.130
kube-slave01 192.168.10.128
kube-slave02 192.168.10.129
kube-slave03 192.168.10.131

** 服务器配置 **
[root@kube-master]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

** k8s 安装环境要求 **
(1).服务器配置最低2c2G
(2).节点之中不可以有重复的主机名、MAC 地址或 product_uuid
(3).禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区
(4).确保br_netfilter模块已加载(默认都已加载) 
注意:生产环境必须禁用swap,测试环境任意

二、内核添加优化参数 所有机器

(1).允许iptables查看桥接流量

[root@kube-master ~]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

(2).检查br_netfilter模块

[root@kube-master ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@kube-master ~]# sudo sysctl --system

三、安装 runtime 所有机器

默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
如果你不指定运行时,则 kubeadm 会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的 Unix 域套接字。 下面的表格列举了一些容器运行时及其对应的套接字路径:
运行时 域套接字
Docker /var/run/dockershim.sock
containerd /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock
如果同时检测到 Docker 和 containerd,则优先选择 Docker。 这是必然的,因为 Docker 18.09 附带了 containerd 并且两者都是可以检测到的, 即使你仅安装了 Docker。 如果检测到其他两个或多个运行时,kubeadm 输出错误信息并退出。
kubelet 通过内置的 dockershim CRI 实现与 Docker 集成。

此处使用docker作为runtime

# step 1: 安装必要的一些系统工具
[root@kube-master ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
[root@kube-master ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
[root@kube-master ~]# sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
[root@kube-master ~]# sudo yum makecache fast
[root@kube-master ~]# sudo yum -y install docker-ce
# Step 4: 开启Docker服务
[root@kube-master ~]# sudo systemctl start docker && systemctl enable docker

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

四、配置docker 所有机器

[root@kube-master ~]# touch /etc/docker/daemon.json
[root@kube-master ~]# cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": ["https://wysd3sxi.mirror.aliyuncs.com"],
  "live-restore": true
}

注意:“registry-mirrors” 使用的阿里云镜像服务加速地址

五、安装 kubeadm、kubelet 和 kubectl 所有机器安装

你需要在每台机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
kubeadm 不能 帮你安装或者管理 kubelet 或 kubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

[root@kube-master ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@kube-master ~]# setenforce 0
[root@kube-master ~]# yum install -y kubelet kubeadm kubectl
[root@kube-master ~]# systemctl enable kubelet && systemctl start kubelet

六、初始化集群

初始化集群时,需要注意 使用kubeadm官方推荐使用systemd作为驱动,cgroupfs和systemd的本质上没有什么区别 systemd相当于再次对cgroupfs进行了封装,操作起来要比直接操作cgroupfs简单.

(1.) 查看kubeadm默认初始化配置

[root@kube-master ~]# kubeadm config print init-defaults > config/k8s_init_config.yml
[root@kube-master ~]# cat config/k8s_init_config.yml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: node
  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: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

修改:
advertiseAddress 地址为masterIP地址
name 为master节点的名称
imageRepository 修改为阿里云代理地址 registry.aliyuncs.com/google_containers
增加:
podSubnet: 10.224.0.0/16

修改后配置文件

[root@kube-master ~]# cat config/k8s_init_config.yml 
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.10.130
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: node
  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.23.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.224.0.0/16
scheduler: {}

(2.) 初始化

[root@kube-master ~]# kubeadm init --config config/k8s_init_config.yml

初始化完成后执行一下
[root@kube-master ~]#mkdir -p $HOME/.kube
[root@kube-master ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kube-master ~]#sudo chown $(id -u):$(id -g) $HOME/.kube/config

过程比较慢,因为需要下载镜像,如果长时间没反应可能会卡在下载镜像的位置,

(3.) 添加机器,在非master机器上执行

[root@kube-master ~]# kubeadm join 192.168.10.130:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1df6968153d10d9a1c15acddd7a894714f5a1ae670ece96419fe685f82e7cae4

将所有机器添加到集群内,此时集群已经初始化完成,但是现在集群还是非可用状态,因为没有部署网络插件,例如coredns 当前应该是pedding状态,因为node当前时NoReady状态,且coredns需要调度到非master节点上,不过也可以通过配置污点容忍使其调度到master上.下面将部署网络插件,此处选择calico,当前只是搭建之后会详解

七、安装网络插件calico

(1.)calico安装条件

确保您的 linux 主机满足以下要求:
x86-64、arm64、ppc64le 或 s390x 处理器
2CPU
2GB 内存
10GB 可用磁盘空间
RedHat Enterprise Linux 7.x+、CentOS 7.x+、Ubuntu 16.04+ 或 Debian 9.x+
确保 Calico 可以在主机上进行管理cali和接口。tunl如果主机上存在 NetworkManager,请参阅 配置 NetworkManager。

(2.)安装calico

[root@kube-master ~]# curl https://projectcalico.docs.tigera.io/manifests/calico-etcd.yaml -o calico.yaml
[root@kube-master ~]# kubectl apply -f calico.yaml

(3.)安装calico命令行工具calicoctl

[root@kube-master ~]# curl -L https://github.com/projectcalico/calico/releases/download/v3.22.0/calicoctl-linux-amd64 -o calicoctl
[root@kube-master ~]# chmod +x ./calicoctl

默认会通过kubernetes api连接到k8s自身的etcd集群

(4.) 查看机器状态&网络状态

注意: 此处显示的是RR模式,默认calico是全互联模式,后期会讲解

[root@kube-master ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+----------------+---------------+-------+------------+-------------+
|  PEER ADDRESS  |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+----------------+---------------+-------+------------+-------------+
| 192.168.10.128 | node specific | up    | 2022-03-02 | Established |
+----------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.
[root@kube-master ~]# kubectl get nodes 
NAME           STATUS   ROLES                  AGE   VERSION
kube-slave01   Ready    <none>                 29h   v1.23.4
kube-slave02   Ready    <none>                 29h   v1.23.4
kube-slave03   Ready    <none>                 30h   v1.23.4
node           Ready    control-plane,master   30h   v1.23.4

环境搭建完成

Logo

开源、云原生的融合云平台

更多推荐