天天看点

2.分布式存储 (kubernetes之kubeadm安装)

目 录​

​​1 Kubernetes架构简介 1​​​

​​2 集群设计 2​​​

​​2.1 网络拓扑 2​​​

​​2.2 节点规划 2​​​

​​3 安装准备 3​​​

​​3.1 基础安装 3​​​

​​3.2 主机名修改 4​​​

​​3.3 修改IP地址 4​​​

​​3.4 配置hosts静态解析 4​​​

​​3.5 修改cgroup driver类型 4​​​

​​3.6 配置k8s的yum源 5​​​

​​3.7 修改k8s的内核参数 5​​​

​​4 kubeadm部署工具安装 5​​​

​​4.1 查看可用版本 5​​​

​​4.2 安装和配置 6​​​

​​4.3 关闭SWAP分区 6​​​

​​4.4 命令行补齐 6​​​

​​5 创建其它node节点 7​​​

​​6 Kubernetes集群初始化 8​​​

​​6.1 了解初始化参数 8​​​

​​6.2 执行初始化命令 8​​​

​​6.3 配置客户端认证 9​​​

​​6.4 添加node节点 9​​​

​​6.5 安装网络插件 9​​​

​​7 验证集群 10​​​

​​7.1 验证集群状态 10​​​

​​7.2 查看pods状态 11​​​

​​8 发布应用 11​​​

分布式存储-第2期

(kubernetes之kubeadm安装)​

元工:2022.07.05​

背景:最近大家对容器技术的讨论越来越多,兴趣也越来越浓,容器的应用场景也非常之多,其中在分布式系统应用领域更突显它的优势和魅力,本文是工作之余所做相关实验的整理,供大家一起学习和分享。​

目标:在仅有的一台工作电脑上搭建全能型虚拟化容器平台,并在其上运行目前主流的分布式存储系统(如:Ceph、Minio、GlusterFS等)作为应用场景进行全方位体验和学习。​

亮点:kubernetes的社区版本更新特别快,每隔3~6个月就会有新版本,本文力求通过一个通用且可指定版本的方法来安装部署K8S集群;最后会按本文所述从头至尾重新做了一遍,以确保本文内容百分百的正确性和百分百的完整性。​

价值:减少学习的硬件成本、减少学习目标前面的障碍、化天堑为通途;不仅是学习容器技术的入门宝典,也为学习分布式存储系统的同学提供了实验环境准备的方法。​

使用要求:对Linux、VMware workstaion有一定的熟悉,祝您使用愉快!​

Kubernetes架构简介​

2.分布式存储 (kubernetes之kubeadm安装)

kubernetes项目架构就是master节点和worker两种节点组成,控制节点即Master 节点,由三个紧密协作的独立组件组合而成,它们分别是负责 API 服务的kube-apiserver、负责调度的 kube-scheduler,以及负责容器编排的 kube-controller-manager。​

集群设计​

网络拓扑​

网络设计详细情况请参考第1期第2章节的内容,拓扑如下图所示:​

2.分布式存储 (kubernetes之kubeadm安装)
虚拟机VM网络拓扑​

节点规划​

虚拟机​ 节点名称​ IP地址​ 角色​ 服务组件​
K8S​ node1​ 192.168.66.11​ Master​

kube-apiserver​

kube-scheduler​

kube-controller-manager​

etcd、kubelet、kube-proxy,kubeadm,​

flannel,docker​

K8S02​ node2​ 192.168.66.12​ worker​ kubelet,kube-proxy,flannel,docker​
K8S03​ node3​ 192.168.66.13​ worker​ kubelet,kube-proxy,flannel,docker​
K8S04​ node4​ 192.168.66.14​ worker​ kubelet,kube-proxy,flannel,docker​

安装准备​

基础安装​

基础安装包括虚拟机的操作系统和容器引擎的安装:1)CentOS系统安装:请参考第1期第3章节的内容;2)Docker安装:请参考第1期第4章节的内容。或者,如果你完成第1期第4章节的实验内容后并做了快照,则可直接基于该快照克隆一个新虚拟机,方法如下:​

1)右键单击虚拟机(如:Docker),依次选择菜单项“管理->克隆”,如下图所示:​

2.分布式存储 (kubernetes之kubeadm安装)

2)在弹出的“克隆虚拟机向导”窗口中,点击“下一步”按钮进入“克隆源”步骤,选择“现有快照”在下拉列表中选择包含了Docker安装的快照版本(如:快照1),点击“下一步”按钮进入“克隆类型”步骤,选择“创建完整克隆”,再点击“下一步”直到完成虚拟机(如: K8S)的创建。​

2.分布式存储 (kubernetes之kubeadm安装)
2.分布式存储 (kubernetes之kubeadm安装)

主机名修改​

// 以node1为例:​

[root@K8S ~]# hostnamectl set-hostname node1 && bash​

修改IP地址​

// 以node1为例:​

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33​

...​

IPADDR="192.168.66.11"​

...​

// 重启网络服务​

[root@node1 ~]# systemctl restart network​

配置hosts静态解析​

// 每个节点都要配置​

[root@node1 ~]# vim /etc/hosts​

192.168.66.11 node1​

192.168.66.12 node2​

192.168.66.13 node3​

192.168.66.14 node4​

修改cgroup driver类型​

// 在daemon.json中,cgroupdriver的类型为“systemd”​

[root@node1 ~]# vim /etc/docker/daemon.json ​

{​

"registry-mirrors": ["https://6wu5f3fc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],​

"exec-opts": ["native.cgroupdriver=systemd"]​

}​

// 重启docker使之生效​

[root@node1 ~]# systemctl restart docker​

// 验证结果​

[root@node1 ~]# docker info​

Server Version: 20.10.16​

Storage Driver: overlay2​

Backing Filesystem: xfs​

Supports d_type: true​

Native Overlay Diff: true​

userxattr: false​

Logging Driver: json-file​

Cgroup Driver: systemd​

Cgroup Version: 1​

配置k8s的yum源​

[root@node1 ~]# 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​​​

EOF​

修改k8s的内核参数​

// 加载 br_netfilter 模块​

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

br_netfilter​

EOF​

//开启ip_forward转发参数​

[root@node1 ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf​

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

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

net.ipv4.ip_forward = 1​

EOF​

// 手动加载所有的配置文件​

[root@node1 ~]# sysctl --system​

kubeadm部署工具安装​

查看可用版本​

[root@node1 ~]# yum list --showduplicates | grep kubeadm​
2.分布式存储 (kubernetes之kubeadm安装)

kubeadm需要和接下来要安装的K8S的版本一致,至于当前为什么选择1.23.X版本在第1期中已经解释,当时版本还是1.23.6,不到一个月就更新到了1.23.8版本,同时1.24.X大版本也更新到了1.24.2,如果不指定版本,默认安装的最新版本就是它,再次也说明了指定版本安装方法的意义。​

安装和配置​

// 安装最新的成熟稳定版本,即v1.23.8​

[root@node1 ~]# yum install -y kubeadm-1.23.8 kubectl-1.23.8 kubelet-1.23.8​

// 设置开机启动​

[root@node1 ~]# systemctl enable kubelet​

// 查看kubeadm版本​

[root@node1 ~]# kubeadm version​

// 查看kubelet的状态,因目前还没初始化,即使执行"systemctl restart kubelet"也无效​

[root@node1 ~]# systemctl status kubelet​

关闭SWAP分区​

// 永久关闭:注释掉"/etc/fstab"的最后一行​

[root@node1 ~]# vim /etc/fstab​

/dev/mapper/centos-root / xfs defaults 0 0​

UUID=00974e16-e0a5-4510-87ee-3379af272347 /boot xfs defaults 0 0​

#/dev/mapper/centos-swap swap swap defaults 0 0​

// 临时关闭:将/etc/fstab文件中所有设置为swap的设备关闭​

[root@node1 ~]# swapoff -a​

// 查看内存使用情况​

[root@node1 ~]# free -m​

命令行补齐​

[root@node1 ~]# yum install bash-completion -y​

[root@node1 ~]# source /usr/share/bash-completion/bash_completion​

[root@node1 ~]# kubectl completion bash >/etc/profile.d/kubectl.sh​

[root@node1 ~]# source /etc/profile.d/kubectl.sh​

[root@node1 ~]# echo "source /etc/profile.d/kubectl.sh" >>.bashrc​

创建其它node节点​

因仅需在Master节点(即node1)上执行Kubeadm init初始化,建议此时此处做个快照备份,也可以作为其它node节点虚拟机的基础镜像,不用再重复以上的步骤。​

2.分布式存储 (kubernetes之kubeadm安装)

类似章节4.1中的方法:右键单击节点Node1的虚拟机(如:CS01,必须关机状态),选择“管理->克隆”菜单项,不同的是这里克隆方法建议选择“创建链接克隆”,更节省磁盘空间,如下图所示。​

2.分布式存储 (kubernetes之kubeadm安装)

根据以上方法,创建出其它3个node节点的虚拟机(如:CS02、CS03、CS03),并依照章节3.2、3.3的方法修改它们的主机名(如:node2,node3,node4)和IP地址。​

通过Ping 命令检查节点之间的网络是否连接OK,如下:​

[root@node1 ~]# ping node2​

[root@node1 ~]# ping node3​

[root@node1 ~]# ping node4​

Kubernetes集群初始化​

了解初始化参数​

[root@node1 ~]# kubeadm init --help​

// 常⻅参数:​

--kubernetes-version kubernetes的版本,默认是最新版本​

--apiserver-advertise-address apiserver的地址,默认会选择访问外⽹的地址

--apiserver-bind-port apiserver访问端⼝,默认为6443

--image-repository registry.aliyuncs.com/google_containers 国内⽆法访问gcr.io仓库,指定阿⾥云仓库,⽆须翻墙【可选】

--pod-network-cidr 指定pod段访问的地址段,根据⽹络插件的不同(可以根据需要修改)​

执行初始化命令​

[root@node1 ~]# kubeadm init --kubernetes-versinotallow="v1.23.8" --apiserver-advertise-address 192.168.66.11 --apiserver-bind-port 6443 --pod-network-cidr 172.16.0.0/16 --image-repository registry.aliyuncs.com/google_containers​

// 结果如下:​

2.分布式存储 (kubernetes之kubeadm安装)

配置客户端认证​

// 根据上一步执行结果中的任务提示(1)进行操作​

[root@node1 ~]#​

mkdir -p $HOME/.kube​

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config​

sudo chown $(id -u):$(id -g) $HOME/.kube/config​

// 验证结果:这时只有⼀个节点​

[root@node1 ~]# kubectl get nodes​

NAME STATUS ROLES AGE VERSION​

node1 NotReady control-plane,master 16m v1.23.8​

添加node节点​

// 根据章节6.2执行结果中的任务提示(3),依次在node2~node4上执行下面操作,将自身作为worker node加入到K8S集群(以node2为例):​

[root@node2 ~]# kubeadm join 192.168.66.11:6443 --token w1mzlm.9iru5wptr4s7e6i6 \​

--discovery-token-ca-cert-hash sha256:60abb7c3b8ade5cb2032265ac8e5801219d9a1ac8b218544fdb47490da80b203​

结果如下:​

2.分布式存储 (kubernetes之kubeadm安装)

//在node-1上查看node的情况:都加入成功,但状态是NotReady,原因是还没安装网络插件。​

[root@node1 ~]# kubectl get nodes​

NAME STATUS ROLES AGE VERSION​

node1 NotReady control-plane,master 16m v1.23.8​

node2 NotReady <none> 74s v1.23.8​

node3 NotReady <none> 67s v1.23.8​

node4 NotReady <none> 60s v1.23.8​

安装网络插件​

依据章节6.2执行结果中的任务提示(2),访问下面网站​​https://kubernetes.io/docs/concepts/cluster-administration/addons/​​,选择你想要安装的网络插件,本文选择flannel网络插件进行介绍,并且不采用其默认的IP网段地址。​

For Kubernetes v1.17+​

Make sure a flanneld binary exists at /opt/bin/flanneld on each node​

kubectl apply -f​​https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml​​​

If you use custom podCIDR (not 10.244.0.0/16) you first need to download the above manifest and modify the network to match your one.​

下载kube-flannel.yml后,修改Network为172.16.0.0/16(默认10.244.0.0/16),保存在命令执行的当前目录。​

1)安装flannel插件​

// 仅需在Master节点上执行​

[root@node1 ~]# kubectl apply -f kube-flannel.yml​

2)部署需要拉取镜像,需要点时间,通过下面方法查看flannel部署的情况​

// 如下:在kube-system命名空间中部署了4个flannel、4个Proxy等等​

[root@node1 ~]# kubectl get pods -n kube-system​

2.分布式存储 (kubernetes之kubeadm安装)

3)校验node节点状态​

// 再来查看节点的状态,这时都变为"Ready"了,说明安装成功!​

[root@node1 ~]# kubectl get nodes​

2.分布式存储 (kubernetes之kubeadm安装)

验证集群​

验证集群状态​

[root@node1 ~]# kubectl get cs​
2.分布式存储 (kubernetes之kubeadm安装)
// 可以看到该状态接⼝已从版本1.19中废弃。​

查看pods状态​

// K8S相关的组件都是以容器pods方式部署在命名空间kube-system中的。​

[root@node1 ~]# kubectl get pods -n kube-system​

2.分布式存储 (kubernetes之kubeadm安装)

kube-proxy和kube-flannel均由4个pods组成,在每个节点各部署1个,这是通过DaemonSets这类⾼级控制器实现的。​

[root@node1 ~]# kubectl get daemonsets.apps -n kube-system​
2.分布式存储 (kubernetes之kubeadm安装)

发布应用​

1)发布⼀个nginx的webserver容器​

[root@node1 ~]# kubectl create deployment demo --image=nginx:1.19.2-alpine --replicas 3​
2.分布式存储 (kubernetes之kubeadm安装)

// 查看pods的部署情况​

[root@node1 ~]# kubectl get deployments.apps​

2.分布式存储 (kubernetes之kubeadm安装)
[root@node1 ~]# kubectl get pods​
2.分布式存储 (kubernetes之kubeadm安装)

2)将应⽤通过service暴露​

[root@node1 ~]# kubectl expose deployment demo --port=80 --target-port=80​
2.分布式存储 (kubernetes之kubeadm安装)

3)查看service的vip​

[root@node1 ~]# kubectl get services​
2.分布式存储 (kubernetes之kubeadm安装)

4)访问微服务应⽤​

[root@node1 ~]# curl http://10.101.228.102​
2.分布式存储 (kubernetes之kubeadm安装)