Docker+K8S+DevOps微服务架构师

学神IT教育:从零基础到实战,从入门到精通!

版权声明:

  1. 本系列文档为《学神IT教育》内部使用教材和教案,只允许VIP学员个人使用,禁止私自传播。否则将取消其VIP资格,追究其法律责任,请知晓!
免责声明: 本课程设计目的只用于教学,切勿使用课程中的技术进行违法活动,学员利用课程中的技术进行违法活动,造成的后果与讲师本人及讲师所属机构无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

联系方式:

学神IT教育官方网站: http://www.xuegod.cn

学神K8S精英学习11群QQ群: 957231097

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图1 4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图2 4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图3

学习顾问:小语老师 学习顾问:边边老师 学神微信公众号

微信扫码添加学习顾问微信,同时扫码关注学神公众号了解最新行业动态,获取更多学习资料及答疑就业服务!

第十章 使用kubeadm搭建K8S容器集群管理系统

本节所讲内容:

10.1 Kubernetes简介

10.2 使用kubeadm部署Kubernetes集群

10.3 实战-安装kubernetes-dashboard-2.0

10.4 实战-node节点加入集群

10.5 实战-通过kubernetes-dashboard创建容器

10.1 Kubernetes简介

10.1.1 Kubernetes概述

Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。 Kubernetes基于docker容器的云平台,简写成:k8s

官方网站:https://kubernetes.io/

官方网站非常友好,为数不多的的国外技术网站支持中文的。

10.1.2 Kubernetes组件介绍

Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象,常见的资源对象如下:

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图4

1、Master节点:Master 节点是 Kubernetes 集群的控制节点,负责整个集群的管理和控制。Master 节点上包含以下组件: (1)、kube-apiserver:集群控制的入口,提供 HTTP REST 服务。REST API 是 Kubernetes 的基础架构。组件之间的所有操作和通信,以及外部用户命令都是 API Server 处理的 REST API 调用。 扩展:REST即表述性状态传递(英文:Representational State Transfer,简称REST)是一种软件架构风格。主要用于前后端分离开发架构。REST描述的是在网络中client和server的一种交互形式。 (2)、kube-controller-manager:Kubernetes 集群中所有资源对象的自动化控制中心 (3)、kube-scheduler:负责 Pod 的调度 2、Node节点:Node 节点是 Kubernetes 集群中的工作节点,Node 上的工作负载由 Master 节点分配,工作负载主要是运行容器应用。Node 节点上包含以下组件: (1)、kubelet:负责 Pod 的创建、启动、监控、重启、销毁等工作,同时与 Master 节点协作,实现集群管理的基本功能。 (2)、kube-proxy:实现 Kubernetes Service 的通信和负载均衡.提供网络管理。 3、Pod

Pod: Pod 是 Kubernetes 最基本的部署调度单元。每个 Pod 可以由一个或多个业务容器和一个根容器(Pause 容器)组成。一个 Pod 表示某个应用的一个实例

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图5

pod [pɒd] 豆荚

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图6

4、ReplicaSet:是 Pod 副本的抽象,用于解决 Pod 的扩容和伸缩。 Replica [ˈreplɪkə] 复制品 5、Deployment:Deployment 表示部署,在内部使用ReplicaSet 来实现。可以通过 Deployment 来生成相应的 ReplicaSet 完成 Pod 副本的创建 6、Service:Service 是 Kubernetes 最重要的资源对象。Service 定义了服务的访问入口,服务的调用者通过这个地址访问 Service 后端的 Pod 副本实例。Service 通过 Label Selector 同后端的 Pod 副本建立关系,Deployment 保证后端Pod 副本的数量,也就是保证服务的伸缩性。 4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图7 7、Kube_proxy 代理 做端口转发,相当于LVS-NAT模式中的负载调度器器 Proxy解决了同一宿主机,相同服务端口冲突的问题,还提供了对外服务的能力,Proxy后端使用了随机、轮循负载均衡算法。

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图8

8、etcd etcd存储kubernetes的配置信息, 可以理解为是k8s的数据库,存储着k8s容器云平台中所有节点、pods、网络等信息。 互动: linux 系统中/etc 目录作用是存储配置文件。 所以etcd (daemon) 是一个存储配置信息的数据库后台服务。

10.1.3 Kubernetes 运行机制

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图9

  1. 用户通过 API 创建一个 Pod

  2. apiserver 将其写入 etcd

  3. scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定

  4. kubelet 检测到有新的 Pod 调度过来,通过 container runtime 运行该 Pod

  5. kubelet 通过 container runtime 取到 Pod 状态,并更新到 apiserver 中

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图10

10.2 使用kubeadm部署Kubernetes集群

10.2.1 初始化集群环境

环境说明(centos7.6):

IP 主机名 角色 内存

192.168.1.63 xuegod63.cn master 4G

192.168.1.64 xuegod64.cn worker 4G

192.168.1.62 xuegod64.cn worker 4G

配置互信

生成ssh 密钥对

[root@xuegod63 ~]# ssh-keygen #一路回车,不输入密码

把本地的ssh公钥文件安装到远程主机对应的账户

[root@xuegod63 ~]# ssh-copy-id 192.168.1.63

[root@xuegod63 ~]# ssh-copy-id 192.168.1.62

[root@xuegod63 ~]# ssh-copy-id 192.168.1.64

所有节点都关闭防火墙和selinux

[root@xuegod63 ~]# systemctl stop firewalld ; systemctl disable firewalld

[root@xuegod62 ~]# systemctl stop firewalld ; systemctl disable firewalld

[root@xuegod64 ~]# systemctl stop firewalld ; systemctl disable firewalld

3台服务器的selinux都关闭

[root@xuegod63 ~]# setenforce 0

[root@xuegod63 ~]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

[root@xuegod62 ~]# setenforce 0

[root@xuegod62 ~]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

[root@xuegod64 ~]# setenforce 0

[root@xuegod64 ~]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

关闭swap分区。

如果不关闭,初始化k8s时,会报以下错误:

Kubelet: Running with swap on is not supported, please disable swap! or set —fail-swap-on flag to false.

[root@xuegod63 ~]# swapoff -a

[root@xuegod63 ~]# free -m #可以看到swap分区的大小,已经变为0

  1. total used free shared buff/cache available

Mem: 5806 176 5430 12 198 5379

Swap: 0 0 0

关闭swap分区。

[root@xuegod63 ~]# swapoff -a

[root@xuegod62 ~]# swapoff -a

[root@xuegod64 ~]# swapoff -a

永久关闭:注释swap挂载

[root@xuegod63 ~]# vim /etc/fstab #给swap这行开头加一下注释#

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图11

[root@xuegod62 ~]# vim /etc/fstab

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图12

[root@xuegod64 ~]# vim /etc/fstab

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图13

注:如果是克隆主机请删除网卡中的UUID并重启网络服务。

内核参数修改:br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。

[root@xuegod63 ~]# modprobe br_netfilter

[root@xuegod63 ~]# echo “modprobe br_netfilter” >> /etc/profile

[root@xuegod63 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@xuegod63 ~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@xuegod62 ~]# modprobe br_netfilter

[root@xuegod62 ~]# echo “modprobe br_netfilter” >> /etc/profile

[root@xuegod62 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@xuegod62 ~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@xuegod64 ~]# modprobe br_netfilter

[root@xuegod64 ~]# echo “modprobe br_netfilter” >> /etc/profile

[root@xuegod64 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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

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

net.ipv4.ip_forward = 1

EOF

[root@xuegod64 ~]# sysctl -p /etc/sysctl.d/k8s.conf

在xuegod63上配置kubeadm、docker-ce的离线yum源

[root@xuegod63 ~]# tar xf k8s-docker.tar.gz -C /opt/

[root@xuegod63 ~]# tee /etc/yum.repos.d/k8s-docker.repo << ‘EOF’

[k8s-docker]

name=k8s-docker

baseurl=file:///opt/k8s-docker

enabled=1

gpgcheck=0

EOF

配置xuegod62 上配置kubeadm、docker-ce的离线yum源:

[root@xuegod63 ~]# scp /etc/yum.repos.d/k8s-docker.repo 192.168.1.62:/etc/yum.repos.d/

k8s-docker.repo 100% 80 19.5KB/s 00:00

[root@xuegod63 ~]# scp -r /opt/k8s-docker/ 192.168.1.62:/opt/

配置xuegod64 上配置kubeadm、docker-ce的离线yum源:

[root@xuegod63 ~]# scp /etc/yum.repos.d/k8s-docker.repo 192.168.1.64:/etc/yum.repos.d/

k8s-docker.repo 100% 80 19.5KB/s 00:00

复制yum源所需软件包到xuegod64

[root@xuegod63 ~]# scp -r /opt/k8s-docker/ 192.168.1.64:/opt/

在master和node上安装kubeadm组件,用于后期安装k8s使用,现在还没有安装k8s,注意安装kubelet的软件包在我们离线yum源中已经包含,可以直接安装,如需安装其他版本k8s可以配置在线源进行安装。

[root@xuegod63 ~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@xuegod63 ~]# systemctl enable kubelet && systemctl start kubelet

[root@xuegod62 ~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@xuegod62 ~]# systemctl enable kubelet && systemctl start kubelet

[root@xuegod64 ~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4

[root@xuegod64 ~]# systemctl enable kubelet && systemctl start kubelet

注:每个软件包的作用

kubelet :运行在集群所有节点上,用于启动Pod和容器等对象的工具 kubeadm :用于初始化集群,启动集群的命令工具 kubectl :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件 扩展:方法2:在线源配置方法: 配置阿里云Kubernetes yum源 [root@xuegod63 ~]# tee /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 然后,再执行下面命令,使用在线yum源安装kubeadm和kubelet 将xuegod63上Kubernetes的yum源复制给xuegod64 [root@xuegod63 ~]# scp /etc/yum.repos.d/kubernetes.repo 192.168.1.64:/etc/yum.repos.d/ 在线源安装一定要指定版本,否则安装最新版,软件版本要和将要安装的k8s集群版本一致。 [root@xuegod63 ~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4 [root@xuegod63 ~]# systemctl enable kubelet && systemctl start kubelet [root@xuegod64 ~]# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4 [root@xuegod64 ~]# systemctl enable kubelet && systemctl start kubelet 在xuegod63上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@xuegod63 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@xuegod63 ~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@xuegod63 ~]# systemctl start docker && systemctl enable docker

添加阿里云镜像加速地址并修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认则为systemd,两者必须一致才可以。

拓展:docker文件驱动systemd

Cgroups 是 linux 内核提供的一种机制,如果你还不了解 cgroups,请参考《Linux cgroups 简介》先了解 cgroups。当 Linux 的 init 系统发展到 systemd 之后,systemd 与 cgroups 发生了融合(或者说 systemd 提供了 cgroups 的使用和管理接口,systemd 管的东西越来越多啊!)。

Systemd 依赖 cgroups

要理解 systemd 与 cgroups 的关系,我们需要先区分 cgroups 的两个方面:层级结构(A)和资源控制(B)。首先 cgroups 是以层级结构组织并标识进程的一种方式,同时它也是在该层级结构上执行资源限制的一种方式。我们简单的把 cgroups 的层级结构称为 A,把 cgrpups 的资源控制能力称为 B。

对于 systemd 来说,A 是必须的,如果没有 A,systemd 将不能很好的工作。而 B 则是可选的,如果你不需要对资源进行控制,那么在编译 Linux 内核时完全可以去掉 B 相关的编译选项。

[root@xuegod63 ~]# tee /etc/docker/daemon.json << ‘EOF’

{

“registry-mirrors”: [“https://rncxm540.mirror.aliyuncs.com“],

“exec-opts”: [“native.cgroupdriver=systemd”]

}

EOF

[root@xuegod63 ~]# systemctl daemon-reload

[root@xuegod63 ~]# systemctl restart docker

在xuegod62上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@xuegod62 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@xuegod62 ~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@xuegod62 ~]# systemctl start docker && systemctl enable docker.service

[root@xuegod62 ~]# tee /etc/docker/daemon.json <<-‘EOF’

{

“registry-mirrors”: [“https://rncxm540.mirror.aliyuncs.com“],

“exec-opts”: [“native.cgroupdriver=systemd”]

}

EOF

[root@xuegod62 ~]# systemctl daemon-reload && systemctl restart docker

在xuegod64上安装docker-ce。我们已经配置了docker本地源,直接安装docker-ce服务。

[root@xuegod64 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker-ce

[root@xuegod64 ~]# yum install docker-ce docker-ce-cli containerd.io -y

[root@xuegod64 ~]# systemctl start docker && systemctl enable docker.service

[root@xuegod64 ~]# tee /etc/docker/daemon.json <<-‘EOF’

{

“registry-mirrors”: [“https://rncxm540.mirror.aliyuncs.com“],

“exec-opts”: [“native.cgroupdriver=systemd”]

}

EOF

[root@xuegod64 ~]# systemctl daemon-reload

[root@xuegod64 ~]# systemctl restart docker

10.2.2 使用kubeadm初始化集群

在xuegod63上,离线导入docker镜像。3台机器都导入一下,避免node节点找不到镜像。

[root@xuegod63 ~]# docker load -i k8s-images-v1.20.4.tar.gz #我已经把所有k8s镜像,都导成一个包了。

[root@xuegod63 ~]# gzip -dc k8s-images-v1.20.4.tar.gz |ssh root@192.168.1.64 ‘cat | docker load’

[root@xuegod63 ~]# gzip -dc k8s-images-v1.20.4.tar.gz |ssh root@192.168.1.62 ‘cat | docker load’

注:gzip 参数: -c 将输出写到标准输出上,并保留原有文件。-d 将压缩文件解压。

使用kubeadm初始化k8s集群

[root@xuegod63 ~]# kubeadm init —kubernetes-version=1.20.4 \

—apiserver-advertise-address=192.168.1.63 \

—image-repository registry.aliyuncs.com/google_containers \

—service-cidr=10.10.0.0/16 —pod-network-cidr=10.122.0.0/16

注:—image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8ss.grc.io拉取镜像。 我们本地有导入到的离线镜像,所以会优先使用本地的镜像。

安装完成。

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图14

节点注册命令我们保存下来稍后我们需要

kubeadm join 192.168.1.63:6443 —token rgz2ww.cmx4k1otzsizgzf2 \

  1. --discovery-token-ca-cert-hash sha256:d8870af95b20d2c3aef441994603f3e1d71a5edde1b038df1e0f0c8754a43ecb

总结: 安装k8s过程

1、安装docker yum install docker-ce

2、安装kubeadm yum install kubeadm

3、使用kubeadm初始化k8s集群 kubeadm init 配置kubectl的配置文件,保存一个证书,这样kubectl命令可以使用这个证书对k8s集群进行管理 [root@xuegod63 ~]# mkdir -p $HOME/.kube [root@xuegod63 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@xuegod63 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@xuegod63 ~]# kubectl get nodes 4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图15 此时集群状态还是NotReady状态,因为网络组建没有启动。 ## 10.3 安装kubernetes网络组件-Calico ### 10.3.1 Calico简介 Calico 是一种容器之间互通的网络方案。在虚拟化平台中,比如 OpenStack、Docker 等都需要实现 workloads 之间互连,但同时也需要对容器做隔离控制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道在拆包或加包头时,则消耗更多的资源并对物理环境也有要求。随着网络规模的增大,整体会变得越加复杂。 Calico把 Host 当作 Internet 中的路由器,使用 BGP 同步路由,并使用 iptables 来做安全访问策略。 设计思想:Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发。 设计优势: 1.更优的资源利用 二层网络使用 VLAN 隔离技术,最多有 4096 个规格限制,即便可以使用 vxlan 解决,但 vxlan 又带来了隧道开销的新问题。而 Calico 不使用 vlan 或 vxlan 技术,使资源利用率更高。

2.可扩展性

Calico 使用与 Internet 类似的方案,Internet 的网络比任何数据中心都大,Calico 同样天然具有可扩展性。

3.简单而更容易 debug

因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,在 host 上更容易进行 debug 调试。

4.更少的依赖

Calico 仅依赖三层路由可达。

5.可适配性

Calico 较少的依赖性使它能适配所有 VM、Container或者混合环境场景。

10.3.2 k8s组网方案对比

flannel方案: 需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响 Overlay方案:在下层主机网络的上层,基于隧道封装机制,搭建层叠网络,实现跨主机的通信;Overlay无疑是架构最简单清晰的网络实现机制,但数据通信性能则大受影响。 calico方案:在k8s多个网路解决方案中选择了延迟表现最好的-calico方案 总结:Flannel网络非常类似于Docker网络的Overlay驱动,基于二层的层叠网络。 层叠网络的优势: 1.对底层网络依赖较少,不管底层是物理网络还是虚拟网络,对层叠网络的配置管理影响较少; 2.配置简单,逻辑清晰,易于理解和学习,非常适用于开发测试等对网络性能要求不高的场景。 层叠网络的劣势: 1.网络封装是一种传输开销,对网络性能会有影响,不适用于对网络性能要求高的生产场景; 2.由于对底层网络结构缺乏了解,无法做到真正有效的流量工程控制,也会对网络性能产生影响; 3.某些情况下也不能完全做到与下层网络无关,例如隧道封装会对网络的MTU限制产生影响。 Calico,就是非层叠网络: Calico网络的优势 1.没有隧道封装的网络开销; 2.相比于通过Overlay构成的大二层层叠网络,用iBGP构成的扁平三层网络扩展模式更符合传统IP网络的分布式结构; 3.不会对物理层网络的二层参数如MTU引入新的要求。 Calico网络的劣势: 1.最大的问题是不容易支持多租户,由于没有封装,所有的虚拟机或者容器只能通过真实的IP来区分自己,这就要求所有租户的虚拟机或容器统一分配一个地址空间;而在典型的支持多租户的网络环境中,每个租户可以分配自己的私有网络地址,租户之间即使地址相同也不会有冲突; 2.不容易与其他基于主机路由的网络应用集成。 注:总结:calico 提供一种不同物理机之间,docker容器高速通信的组网方案

10.3.2 了解一下Calico架构图

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图16

有兴趣的同学,可以了解一下:Calico网络模型主要工作组件:

1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。felix [ˈfiːlɪks] 费力克斯制导炸弹

2.etcd:分布式键值存储,相当于k8s集群中的数据库,存储着Calico网络模型中IP地址等相关信息。

3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,即每台host上部署一个BIRD。BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议比如 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。

4.BGP Route Reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步从而大大减少连接数。[meʃ] Reflector [rɪˈflektə(r)] 反射器

10.3.3 安装Calico网络组件

上传calico.yaml到linux中,使用yaml文件安装calico 网络插件 。

[root@xuegod63 ~]# kubectl apply -f /root/calico.yaml

注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml

拉取镜像需要一定时间,所以我们查看pod状态为running则安装成功。

[root@xuegod63 ~]# kubectl get pod —all-namespaces

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图17

再次查看集群状态。

[root@xuegod63 ~]# kubectl get node

NAME STATUS ROLES AGE VERSION

xuegod63.cn Ready control-plane,master 26m v1.20.4

10.4 实战-安装kubernetes-dashboard-2.0

kubernetes-dashboard2.0 yaml文件地址:

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

很多时候官方的资源我们不能够直接访问,可以通过浏览器访问并使用ctrl+s进行保存,然后上传使用。

修改yaml文件,默认的dashboard是没有配置NodePort的映射的。

[root@xuegod63 ~]# vim recommended.yaml

在第42行下方添加2行

nodePort: 30000 type: NodePort 增加完后,如下:

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图18

添加dashboard管理员用户凭证,在原文件中追加以下内容:

[root@xuegod63 ~]# cat >> recommended.yaml << EOF

—- # —————————- dashboard-admin —————————- # apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard —- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin

EOF

配置文件详解:

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图19

安装dashboard

[root@xuegod63 ~]# kubectl apply -f recommended.yaml

[root@xuegod63 ~]# kubectl get pods —all-namespaces

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图20

查看登录令牌

[root@xuegod63 ~]# kubectl describe secrets -n kubernetes-dashboard dashboard-admin

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图21

token: 浏览器登录时使用以下token进行登录。

eyJhbGciOiJSUzI1NiIsImtpZCI6ImJmT29jQ2U5aXZCbm5aMkNlQklrVkFIVXpoUGVTeUIzb0FyYkU5eURCY2cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZmM1eDkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzY2ZGY5ZjAtNzM5Yi00YTYwLTk5YjQtMDE2YTE1MTdjNWExIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.WgNoJNqgkO0DJdPXVKHORMqtaru1lhLwO-dA0bkChQ_gkAUfPYHgaNBP_8dHeHup9Kng-9ns21t7ENlzufKvPLk7UJSeBP6kYEPNG-pyIZ8HmwJdg2C55raMGccLTW8Hd5Dwfy5Ejae894yY_RYTiHmAXUHgEVuKtPsootIJyKNGgF1TtsaJgmegjjkK8z-w9mIKw4D86W6Gi_5NDsr-bC3LVIm-SliqL9FR9lhp4b7-SpDA3pNuuzltnfeKPF1Th1ApNvGEVTXT05LkKiFvtDuYAV80am6J5-S1Z435362HxedCygsL6yqz4AeNXAPp2-m6kmLtOXB6-RhPsWlQ

访问web界面(推荐使用Firefox浏览器)

https://192.168.1.63:30000/

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图22

使用token登录

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图23

首次登陆可能会比较慢,请勿反复刷新页面。

10.5 实战-node节点加入集群

10.5.1 将node节点加入到集群中

在xuegod63上查看加入节点的命令:

[root@xuegod63 ~]# kubeadm token create —print-join-command

W0724 16:56:47.860390 28055 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]

kubeadm join 192.168.1.63:6443 —token s6f1ab.g6s71a2gn4d9pq5v \ —discovery-token-ca-cert-hash sha256:30092f3fd915c48b67695b8242a6196aebdde3a21c3bc521a8936bd628e30b0f

把xuegod62加入k8s集群:

[root@xuegod64 ~]# kubeadm join 192.168.1.63:6443 —token s6f1ab.g6s71a2gn4d9pq5v \

—discovery-token-ca-cert-hash sha256:30092f3fd915c48b67695b8242a6196aebdde3a21c3bc521a8936bd628e30b0f

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图24

把xuegod64加入k8s集群:

[root@xuegod64 ~]# kubeadm join 192.168.1.63:6443 —token s6f1ab.g6s71a2gn4d9pq5v \

—discovery-token-ca-cert-hash sha256:30092f3fd915c48b67695b8242a6196aebdde3a21c3bc521a8936bd628e30b0f

互动:如何在普通的node节点上查看集群状态?

将xuegod63证书导入到xuegod64上,这样在xuegod64才可以使用kubectl命令管理k8s

[root@xuegod64 ~]# mkdir ~/.kube

拷贝xuegod63的配置文件到xuegod64

[root@xuegod63 ~]# scp ~/.kube/config 192.168.1.64:/root/.kube/

[root@xuegod64 ~]# kubectl get nodes

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图25

可以看到xuegod64和xuegod62的ROLES角色为空,我们可以手工搭上标签,这里不影响集群正常工作。

要xuegod64或xuegod63上给:xuegod64和xuegod62打上标签。不在能xuegod62上操作,因为xueogd62没有执行kubectl的权限。

[root@xuegod64 ~]# kubectl label node xuegod62.cn node-role.kubernetes.io/worker=worker

[root@xuegod64 ~]# kubectl label node xuegod64.cn node-role.kubernetes.io/worker=worker

10.5.2 离线docker镜像包制作方法

技巧1:工作中,如果想把物理机上所有镜像导出,制作成docker镜像离线包,可以使用以下命令

[root@xuegod63 ~]# docker save docker images | cut -f1 -d ' ' | sed -n '2,$p' |gzip > k8s-images-v1.20.4.tar.gz

cut 参数 -f1 打印第1列, -d‘ ’ 以空格作为分隔符

sed 命令参数 -n :只打印匹配的行 ; sed的编辑命令参数 p 打印匹配行,和-n一起合用

技巧2:如果想把整个集群中所有机器上的镜像,都打包成一个镜像,可以执行以下命令

docker save 镜像名 | gzip |ssh root@192.168.1.63 ‘cat | docker load’

1、先将node节点上所有镜像远程导入到master上:

[root@xuegod64 ~]# docker save docker images | cut -f1 -d ' ' | sed -n '2,$p' | gzip |ssh root@192.168.1.63 ‘cat | docker load’

2、master上拥有所有docker镜像后,再在master上,把镜像统一导出一下

[root@xuegod63 ~]# docker save docker images | cut -f1 -d ' ' | sed -n '2,$p' |gzip > k8s-images-v1.20.4.tar.gz

注:我就是这样,把集群中的所有镜像,打包成一个包的。方便后期使用

10.6 实战-通过kubernetes-dashboard创建容器

10.6.1 通过kubernetes-dashboard创建容器

web界面点击+进行创建pod

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图26

创建nginx pod

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图27

点“Deploy”开始部署。

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图28

注:应用名称:nginx

容器镜像:nginx

pod数量:2

service: external 外部网络

端口(port):3000 目标端口(targetport):80

注:表单中创建pod时没有创建nodeport的选项,会自动创建在30000+以上的端口。

关于port、targetport、nodeport的说明:

nodeport是集群外流量访问集群内服务的端口,比如客户访问nginx,apache,

port是集群内的pod互相通信用的端口类型,比如nginx访问mysql,而mysql是不需要让客户访问到的,port是service的的端口

targetport目标端口,也就是最终端口,也就是pod的端口。

已经创建成功:

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图29

查看分配的nodeport端口

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图30

浏览器访问:http://192.168.1.63: 30151/http://192.168.1.62:30151/http://192.168.1.64:30151/

注:访问xuegod63,xuegod62,xuegod64都是可以的。

4-使用kubeadm搭建K8S容器集群管理系统-v14 - 图31

总结:

10.1 Kubernetes简介

10.2 使用kubeadm部署Kubernetes集群

10.3 实战-安装kubernetes-dashboard-2.0

10.4 实战-node节点加入集群

10.5 实战-通过kubernetes-dashboard创建容器