Kubernetes--用kubeadm搭建集群环境

架构

k8s的组件架构图

 

 

 

OCI (Open Container Initiative) 开放容器标准。是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。

Protobu是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。可以进行数据编码,提高数据压缩率。

RPC (Remote Procedure Call)是远程过程调用,就是将一个服务调用封装在一个本地方法中,让调用者像使用本地方法一样调用服务,对其屏蔽实现细节。而具体的实现是通过调用方和服务方的一套约定,基于TCP长连接进行数据交互达成。

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

  • 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)

  • 接口层:kubectl 命令行工具、客户端 SDK 以及集群联绑

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  1. Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow<工作流>等
  2. Kubernetes 内部:CRI、CNI、CVI、镜像仓库、CloudProvider、集群自身的配置和管理等

 

这里使用的是kubeadm工具来进行集群的搭建。

kubeadm是Kubernetes 官方提供的用于快速安装Kubernetes 集群的工具,通过将集群的各个组件进行容器化安装管理,通过kubeadm的方式安装集群比二进制的方式安装要方便不少,但是kubeadm还处于 beta 状态,还不能用于生产环境,Using kubeadm to Create a Cluster文档中已经说明 kubeadm 将会很快能够用于生产环境了。 对于现阶段想要用于生产环境的,建议参考文档:follow-me-install-kubernetes-cluster

 

环境 (所有节点)

 

我们这里准备三台Centos7的主机用于安装,后续节点可以根据需要添加即可

配置之前,建议升级内核

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的Docker、Kubernetes 不稳定。

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry中是否包含 initrd16 配置,如果没有,再安装一次!
yum --disablerepo="*" --enablerepo=elrepo-kernel list available
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 重新创建内核配置. 设置开机从新内核启动
grub2-set-default 0

重启机器:

reboot

hosts 解析:

cat /etc/hosts
192.168.11.11 k8s-master
#最低配置 2G 2C
192.168.11.12 k8s-node01
192.168.11.13 k8s-node02
192.168.11.16 img.zx.com
#harbor仓库

#根据解析修改各主机的主机名

禁用防火墙:

systemctl stop firewalld

systemctl disable firewalld

禁用SELINUX:

setenforce 0

cat /etc/selinux/config

SELINUX=disabled

创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

执行如下命令使修改生效:

sysctl -p /etc/sysctl.d/k8s.conf

关闭 swap 交换分区

swapoff -a

sed -i '/swap/s/^/#/' /etc/fstab

所有节点配置并安装 kubeadm、kubelet、kubectl

首先,我们要准备相关的yum源文件

#阿里云 yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#阿里云的 k8s 源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

安装 Kubelet、Kubeadm 和 Kubectl

# 搜索 kubeadm 版本
yum list kubeadm --showduplicates | sort -r

# 选择 1.20.9 版本
#yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9

# Kubelet 设置开机启动
systemctl enable kubelet
# kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。

master节点 生成初始化配置文件

Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配置内容是通过 kubeadm config 命令写入配置文件的。

kubeadm config print init-defaults > init-config.yaml
# 其中,kubeadm config 除了用于输出配置项到文件中,还提供了其他一些常用功能
# kubeadm config view
# 查看当前集群中的配置值。
# kubeadm config print join-defaults
# 输出 kubeadm join 默认参数文件的内容。
# kubeadm config images list
# 列出所需的镜像列表。
# kubeadm config images pull
# 拉取镜像到本地。
# kubeadm config upload from-flags
# 由配置参数生成 ConfigMap。

修改初始化配置文件

vim init-config.yaml
  10 kind: InitConfiguration     # 功能块类型 用于定义初始化配置,如初始化使用的 token 以及apiserver 等。
  12 advertiseAddress: 192.168.11.11     # master节点IP地址
  16 name: k8s-master      # 如果使用域名保证可以解析,或直接使用IP地址
  31 dataDir: /var/lib/etcd     # etcd 容器挂载到本地的目录
  32 imageRepository:
  registry.aliyuncs.com/google_containers     # 修改为国内地址
  33 kind: ClusterConfiguration
  #用于定义 apiserver、etcd、network、scheduler、controller-manager 等 master 组件相关配置项。
  38 podSubnet: 10.244.0.0/16
  # 因为我们这里选择 flannel 作为 Pod 的网络插件,所以需要新增加Pod网段 10.244.0.0/16

拉取所需镜像

kubeadm config images list --config init-config.yaml
kubeadm config images pull --config init-config.yaml
docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED         SIZE
rancher/mirrored-flannelcni-flannel                               v0.18.1    e237e8506509   4 months ago    62.3MB
rancher/mirrored-flannelcni-flannel-cni-plugin                    v1.1.0     fcecffc7ad4a   4 months ago    8.09MB
#这里就放两条哈~

配置 cgroup 驱动

安装完成后,还需要对kubelet进行配置,因为用yum源的方式安装的kubelet生成的配置默认--cgroup-driver为systemd,容器运行时和kubelet使用systemd作为cgroup驱动,以此使系统更为稳定。可以通过docker info命令查看:

docker info |grep Cgroup
 Cgroup Driver: cgroupfs

所有节点在配置文件里设置使用systemd驱动

more /etc/docker/daemon.json 
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    "insecure-registries": ["http://img.zx.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
    }
systemctl daemon-reload
systemctl restart docker

docker info |grep Cgroup

  

集群初始化安装

在master节点上用kubeadm命令来初始化我们的集群了:

kubeadm init --config init-config.yaml

命令非常简单,就是kubeadm init,如果出现 running with swap on is not supported. Please disable swap 之类的错误,则是没有关闭swap 分区。

成功初始化的输出为:

...
Your Kubernetes control-plane has initialized successfully!

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/
  
Then you can join any number of worker nodes by running the following on each as root:
  
kubeadm join 192.168.11.11:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash
sha256:e399949a218139237d8023abf2879fbf3e387c2dcc0fadc3d4c18657ce71041d  

注意将上面的加入集群的命令保存下来。 默认token有效期为24小时,当过期之后,该token不可用。

如需重新创建token

kubeadm token create --print-join-command
kubeadm join 192.168.11.11:6443 --token
di3w44.8kthobqs6ggsn7qu --discovery-token-ca-cert-hash sha256:9c0433ae5101b016392e14dc320452c5a3dab7ffee8179d48a85db7d7f035110

初始化的输出信息记录了 kubeadm 初始化整个集群的过程,生成相关的各种证书、kubeconfig 文件、bootstraptoken 等等,后边是使用kubeadm join 往集群中添加节点时用到的命令,下面的命令是配置如何使用kubectl访问集群的方式:

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

新节点加入集群执行以下命令:

kubeadm join 192.168.11.11:6443 --token
di3w44.8kthobqs6ggsn7qu --discovery-token-ca-cert-
hash sha256:9c0433ae5101b016392e14dc320452c5a3dab7ffee8179d48a85db7d7f035110

使用 kubectl 来查看集群的信息:

kubectl get cs
# component statuses 组件状态
NAME                STATUS   MESSAGE             ERROR
controller-manager  Healthy  ok
scheduler           Healthy  ok
etcd-0              Healthy  {"health":"true"}

kubectl get csr
# certificate signing requests 证书签名请求
······

kubectl get nodes
NAME       STATUS   ROLES  AGE VERSION
k8s-master NotReady master 62m v1.18.0
k8s-node01 NotReady <none> 47m v1.18.0
k8s-node02 NotReady <none> 47m v1.18.0

如果集群安装过程中遇到问题,可以使用下面的命令来进行重置:

kubeadm reset
# 将所有节点都重置,然后重新安装
ifconfig cni0 down && ip link delete cni0
rm -rf /var/lib/cni/

Kubectl 自动补全

Kubectl 命令提供了自动补全功能,需要手动安装这个功能:

source <(kubectl completion bash)

echo "source <(kubectl completion bash)" >> ~/.bashrc

安装 Pod Network

选择安装flannel网络插件,和安装普通的 pod 一样:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 此配置文件里的镜像需要科学/上网才能下载,可以选择使用离线的镜像包

kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

注意:如果节点有多个网卡的话,需要在 kube-flannel.yml 中使用--iface参数指定集群主机内网网卡的名称,否则可能会出现 dns 无法解析。flanneld 启动参数加上--iface=

 args:

- --ip-masq

- --kube-subnet-mgr

- --iface=eth0

安装完成后使用 kubectl get pods 命令可以查看到我们集群中的组件运行状态,如果都是Running 状态的话,那么恭喜你,你的 master 节点安装成功了。

kubectl get pods -A

  

 

 

添加节点

同样的上面的环境配置、docker 安装、kubeadmin、kubelet、kubectl这些都在Node(192.168.11.12)节点安装配置好过后,我们就可以直接在Node 节点上执行kubeadm join 命令了(上面初始化的时候有)

如果出现下面的错误信息:

[discovery] Failed to request cluster info, will try again:[Gethttps://192.168.11.11:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid],应该是 master 和 node 之间时间不同步造成的,执行 ntp 时间同步后,重新init、join即可。

如果 join 的时候出现下面的错误信息:[ERROR CRI]: unable to check if the container runtime at "/var/run/dockershim.sock" is running: fork/exec/usr/bin/crictl -r /var/run/dockershim.sock info: no such file or directory,这个是因为 cri-tools 版本造成的错误,可以卸载掉即可:yum remove cri-tools。

该节点加入到集群之后,把 master 节点的~/.kube/config文件拷贝到当前节点对应的位置即可使用 kubectl 命令行工具了。

 

posted @ 2022-10-12 15:36  Zix-  阅读(260)  评论(0编辑  收藏  举报