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 以及集群联绑
-
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow<工作流>等
- 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 命令行工具了。