一、环境准备
使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0.9),k8s-node3(192.168.0.10)。系统安装成功后配置root远程登录功能,以便使用ssh客户端工具链接。
初始化系统设置:
◉分配固定IP :设置虚拟机固定IP的方式比较多,本方案采用设置虚拟的MAC地址为静态ID,然后在路由器中为MAC分配固定IP。
◉开启SSH远程登录:运行命令” yum install openssh-server “安装ssh服务端工具,安装完成后运行命令” systemctl enable sshd.service “设置开启自启动, 运行命令” vim /etc/ssh/sshd_config “编辑配置文件,设置如下:
◉修改IPV6为IPV4:centos默认使用ipv6的方式,我们需要修改为ipv4模式来实现ssh客户端的远程连接,具体方法是 cd到 /etc/sysconfig/network-scripts目录下,vim 编辑 ifcfg-eth1 文件,如图,设置IPV6INIT=no,ONBOOT=yes。
◉安装docker环境:完成以上步骤后,重启电脑即可使用ssh工具连接,复制命令” curl –sSL https://get.daocloud.io/docker | sh ” 安装dockers环境。
◉设置docker开机自启:运行命令” systemctl enable docker ” 将docker加入开机启动项。
◉配置docker镜像加速器:国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,此处以配置阿里云镜像加速器为例,登录https://cr.console.aliyun.com/,选择容器镜像服务-镜像工具-镜像加速器,如图所示,通过在/etc/docker/daemon.json文件中配置registry-mirrors属性来实现该功能:
◉设置防火墙规则:设置防火墙规则的目的是为了确保集群中的机器能够相互通信,本次集群直接使用命令” systemctl disable firewalld “关闭防火墙。
◉设置 /proc/sys/net/bridge目录下bridge-nf-call-iptables和bridge-nf-call-ip6tables文件的内容为1,确保的 Linux 节点的 iptables 正确查看桥接流量。
◉关闭Linux系统的交换分区:为了保证kubelet的正常运行,必须禁用swap交换分区。window平台上称为虚拟内存。在物理内存不够用时,操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区,从而为当前运行的程序留出足够的物理内存。运行命令” free -m “结果证明已经开启了交换分区,修改/etc/fstab文件,注释掉加载swap分区的这行记录,重启Linux系统即可。
二、安装K8S集群
完成以上步骤后,就可以进行k8s组件的安装了,我们需要三个必须的组件kubeadm、kubelet 和 kubectl,把他们安装到每台集群的机器上。其中kubeadm是引导我们创建集群的命令;kubelet 是集群中的所有机器上运行的组件,并执行诸如启动 pod 和容器之类的操作;kubectl是与集群对话的命令行工具。读者请注意,kubeadm不会为你安装或管理kubelet和kubectl,
因此你需要确保它们与control plane之间版本的匹配,如果不这样做,则存在版本偏差的风险,这可能导致意外的错误行为。
安装步骤:
1、配置k8s下载地址信息(配置为阿里云镜像,国外镜像很难下载成功),运行如下命令。
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=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF
2、运行如下命令安装三个组件。
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
3、设置kubelet的开机自启动:启动后kubelet会每隔几秒启动一次来探测kubeadm的命令。
systemctl enable kubelet && systemctl start kubelet
4、提前准备k8s集群必须的组件:在后续的kubeadm init命令中,他需要下载一些必须镜像,这些镜像可以通过 ” kubeadm config images list “命令来查看,如图:
但是这些镜像默认是从国外源,在国内无法下载,因此有必要在此之前先使用国内源下载好这些镜像,此处使用阿里云镜像地址下载:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
根据上面的命令把镜像都下载完成后,进行镜像复制,调用 ” docker tag oldimages newimages “命令复制出满足kubeadm init的标准镜像,代码如下:
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6 k8s.gcr.io/kube-apiserver:v1.23.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6 k8s.gcr.io/kube-proxy:v1.23.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6 k8s.gcr.io/kube-controller-manager:v1.23.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6 k8s.gcr.io/kube-scheduler:v1.23.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0 k8s.gcr.io/etcd:3.5.1-0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
执行完成所有复制命令后,docker images查看镜像,发现需要的镜像已准备好,列表如下:
5、使用kubeadm来引导我们创建集群。首先运行 ” kubeadm init [arg]”命令,会进行一系列预检查以确保机器已准备好运行 Kubernetes。这些预检查会显示警告并在错误时退出(遇到错误时需要根据具体输出日志解决错误)。然后下载并安装集群控制平面组件。 kubeadm init 包含一些指定参数,其参数说明下:
--apiserver-advertise-address string 设置 apiserver 绑定的 IP. --apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443) --control-plane-endpoint string 设置控制平面的端点(matser控制节点的IP或域名) --apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。 --cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki") --certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key --config string kubeadm 配置文件的路径. --cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定. --dry-run 测试,并不真正执行;输出运行后的结果. --feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。 --help -h 帮助文档 --ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. --image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io") ,国内一般无法直接从k8s.gcr.io获取,需要改为国内的代理地址 --kubernetes-version string 选择K8S版本. (default "stable-1") --node-name string 指定node的名称,默认使用 node 的 hostname. --pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络 --service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12"),不能与机器的IP段有重叠 --service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local") --skip-certificate-key-print 不打印 control-plane 用于加密证书的key. --skip-phases strings 跳过指定的阶段(phase) --skip-token-print 不打印 kubeadm init 生成的 default bootstrap token --token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}/.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef --token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s) --upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.
本方案我们使用如下命令参数来初始化主控节点:
kubeadm init / --apiserver-advertise-address=192.168.0.10 / --control-plane-endpoint=192.168.0.10 / --service-cidr=10.96.0.0/16 / --pod-network-cidr=192.168.0.0/16
执行以上命令,init 预检查到我的机器CUP和内存不满足性能要求,提示如下:此时需要关闭虚拟机,重新调整CPU核心数和内存大小。
继续运行命令,发现提示 ” It seems like the kubelet isn’t running or healthy. “,的错误,表示kubelet未能正常运行,通过查看kubelet的运行日志发现报错如下:
意思是因为kubelet cgroup驱动程序“systemd”与docker cgroup驱动程序“cgroupfs”不同,所以我们需要调整为相同。调整方式为修改docker cgroup的驱动程序为systemd(官方推荐用systemd),编辑/etc/docker/daemon.json文件,修改或增加 “exec-opts”:[“native.cgroupdriver=systemd”] 代码:
{ "registry-mirrors": ["https://yyipnm7g.mirror.aliyuncs.com"], "exec-opts":["native.cgroupdriver=systemd"] }
重启机器再次运行init命令(如果运行失败,提示某些端口被占用和某些文件已经存在,需要使用” kubeadm reset “重置后再运行)后,这可能会需要几分钟来完成组件的安装,安装成功后应该看到类似如下的输出:
屏幕输出中提示:
◉你的Kubernetes控制飞机已成功初始化。
◉要开始使用群集,您需要以普通用户身份运行以下操作:
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
◉您应该在集群上部署一个pod网络,使用下列选项之一运行kubectl apply -f [podnetwork].yaml:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
选项提供了一个地址,这个地址包含了很多的网络插件,如图:
此处本人使用Calico插件,点击选项可能无法访问网址,无法下载其对应的yaml文件。使用如下命令下载yaml文件:
curl https://docs.projectcalico.org/manifests/calico.yaml -O
如果无法直接在Linux中下载,可以直接访问https://docs.projectcalico.org/manifests/calico.yaml下载后上传到主机。然后再使用命令:
kubectl apply -f calico.yaml
创建POD网络,如图所示,表示POD网络创建完成:
等待一段时间使用 ” kubectl get nodes “查看节点状态,节点将由NotReady–>Ready,如图:
◉通过在每个节点上复制证书颁发机构和服务帐户密钥,然后以root用户身份运行以下操作,可以加入任意数量的控制平面节点:
kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f / --discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8 / --control-plane
◉通过root用户身份在每个节点上运行以下操作,可以加入任意数量的工作节点:
kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f / --discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8
根据这些提示完成提示操作后,集群环境就搭建完成了,init成功后的这些提示建议保存,方便后续增加主节点和工作节点。最终查看集群状态结果如下:
三、在集群中部署应用
待续。。