适当的焦虑能够帮你不断的成长,当你没有目标的时候,会比过度焦虑更可怕,人往往是在发展中被淘汰的。——cap

9.1 k8s 基础入门及架构介绍

主要内容:
(1)k8s基本介绍
(2)k8s安装
(3)kompose工具介绍
(4)应用部署到k8s中

1.什么是k8s?
k8s全称是kubernetes。
(1)k8s是谷歌开源的容器集群管理系统
(2)可以简化应用程序的工作流,加快开发速度
(3)由Google的工程师开发和设计

2.为什么需要用到k8s?它解决了什么问题和什么痛点?
(1)在生产环境中会涉及多个容器
就是我们把生产型的应用打包成镜像的时候,有的时候这个应用它一个容器可能满足不了性能的需求,当然我们会开多个容器,也就相当于在多台机子上进行部署。
生产型的应用会是这样子的,要求你多个容器多个地方去部署。

(2)容器必须跨多个服务器主机进行部署
就是我们这里的容器必须跨多个服务器,并且在多个服务器之间进行部署,如果没有k8s,这也是一个难点。
比如说我们现在docker是在单机上的,如果没有k8s,那docker需要在多个主机上面运行的话,可能要通过手工或者通过shell。

(3)借助k8s构建跨多个容器的应用服务、跨集群调度、扩展这些容器
我们可以借助k8s跨多个容器,跨多个应用,再跨集群进行调度。

这就是我们为什么需要k8s干活的原因。

3.k8s有哪些应用?
(1)跨多台主机进行容器编排
这句话是什么意思?
翻译翻译就是在多个主机之间可以主动地去调用这个容器,然后决定这个容器是否起,决定这个容器在哪个节点上进行跑。
这就是一个跨多台主机的容器编排。

(2)更加充分的利用硬件,最大程度的获取运行企业应用所需的资源
这句话怎么去解释?
就是我们所有的硬件加到了k8s集群里面,k8s它会把所有的硬件统一的计算。

当我们一个容器,假如说需要4核8g的时候,它会通过它的计算调度规则,计算出哪一个节点有4核8g,接着会把pod调到那个节点上,然后进行使用。
如果有的节点上资源很空,它会调动到这个节点的概率就很大,如果这个节点上的资源所剩无几了,新进的应用大概就不会调用这个节点了。
(3)利用自动布局,自动重启,自动复制以及自动扩展功能,对应用实施状况检查和自我修复。
自动的重启,自动的扩展,这一块在传统应用上面是非常少的,这也是k8s的核心。

4.k8s相关术语
前面说的是是什么的话题,接下来介绍k8s基本词法单元。

(1)主机【master】:用于控制k8s节点的计算机,所有的任务分配都是这个节点分配的。
(2)节点【node】:负责执行请求和所分配任务的计算机。由k8s主机负责对节点进行控制。
(3)容器集【pod】:被部署在单个节点上的,且包含一个或多个容器的容器组。同一个容器集中的所有容器共享同一个IP地址,IPC,主机名,以及其他资源。
这里的容器集是多个docker容器集合在一起,我们叫做pod。
在k8s里面要重点强调一下,在k8s里面最小的单元是容器集,不是容器。
我们在主机上面使用docker的时候,它可能是通过镜像启动了一个容器,但是在k8s里面,它最小的容器集【pod】。
这个pod里面可以有多个容器,也可以只有一个容器。

在这个pod里面,在同一个容器集里面,所有容器它共享同一个IP地址,IPC主机名以及其他的资源。
记住它是k8s里面的最小单元。

(4)服务【service】:将工作内容与容器集分离。
这里的service可以理解docker-compose里面的服务的名称,我们在k8s里面可以通过这个service的名称,主动的找到我们所对应的pod,可以转发过去。
service主要是用来将工作内容与容器集分离。

(5)kubelet:运行在节点上的服务,可读取容器清单(container manifest),确保指定的容器启动并运行。
它运行在我们的节点上的一个服务,它确保我们的容器按照指定的规则启动并且运行kubelet。

(6)kubectl:k8s的命令行配置工具。

5.k8s架构图
在这里插入图片描述
解读信息:
(1)
在master节点上有一个API Server。它就是master节点上的一个主线。
然后通过API Server,在master节点上还会有Scheduler【链路器】,还有ETCD,ETCD主要用于我们集群数据的存储,还有Controller Manager。
在master节点上主要有这三块。

(2)
再来看一下Node节点。
在Node1和Node2里面,有一个抽象的架构是Networking。
网络这边会有kubelet对它进行交互,kubelet也可以通过自己的命令启动和管理 容器,容器和底层 OS系统也是有一个交互的。
OS系统是建立在硬件上的。

这整体构建起来的就是k8s比较抽象的一个架构图.

然后我们这里有一个数据的传输方式,是按照不同的颜色和箭头标出来的不同的方式。
比如说我们用户对于API Server这一块是通过JSON格式来进行调用和传输,并且这个紫色的箭头是gRPC,就是kubelet和API Server进行交互。

简单理解:
CNI:kubelet通过CNI跟网络进行交互
CRI:kubelet通过CRI跟容器进行交互
OCI:容器通过OCI跟OS系统层进行交互

更多参考传送门:
CNI、CRI和OCI是什么?
k8s中文文档

(3)组件分布图
在这里插入图片描述
解读信息:
问3个问题即可:
(1)这张图由哪些词法单元组成?
(2)每个词法单元之间的联系是什么?
(3)数据是怎么流转的?

(1)可以看到这里有一个master节点和一个工作节点worker node。
在master节点上有三个非常重要的组件。
当然这个etcd也可以部署在master上,也可以单独的部署。

但是最重要的这个三个组件肯定要部署在master节点上。

(a) API Server:用于来接收我们用户的一些操作,包括命令行的一些操作也是通过API Server进行接收的。
(b) Controller Managers:控制器。不仅仅是一个controller manager,它有很多个controller manager组成,包括有副本级,包括我们的node控制器等等,我们后面会介绍。
© Scheduler:调度器
这三个重要的组件是部署在master上的。

当然工作节点上也会部署一些非常重要的文件。

(a) kubelet:它是用来接受 API Server 发出的一些信息,它主要和API Server进行交互,以及控制我们node节点上的一些容器,包括pod。
(b) kube-proxy:反向代理。假设我们现在有一个互联网的访问请求,还会发送到这个node节点上,有一个代理,这个k8s里面有维护反向代理的一个表,比如说来了一个请求,应该转发到哪个pod上,哪个节点上,它都是有的。【根据反向代理的表进行转发】

当这个互联网的请求进来了以后,它通过这个代理,它可以访问到具体想访问的POD上面去。

以上就是k8s的架构图解读:
(1)一个是消息的通知架构。
(2)一个是组件的分布架构。

9.2 k8s api server 架构及创建应用原理

主要内容:
(1)k8s核心组件
(a)集群管理入口:kube-apiserver
(b) 管理控制中心:kube-controller-manager
顾名思义,里面有很多的controller。
© 调度器:kube-scheduler
容器怎么去运行,在哪儿运行,都是通过调度器和调度算法进行计算的。
(d) 配置中心:etcd
可以单机部署,也可以以集群的方式部署。
(e) 集群管理工具:kubectl
使用率很高。
(f) 节点POD管家:kubelet
工作节点,管理docker容器、POD。
(g) 服务外部代理:kube-proxy
反向代理。

(2)每个组件里有什么
(a)
在这里插入图片描述
解读信息:
组成解读:
api层有:
核心api,分组api,健康检查,日志,看板,性能度量,OpenAPI【swagger api】。

访问控制层:
通过api层以后,会来到访问控制层。该层会鉴别身份是否合法。

注册表层:
主要存储一些信息。包括Pod信息,Namespace信息,Service信息,apps信息,Storage信息等等等。

ETCD集群层:
最终注册表层 的这些信息也会存储起来。

主要就是这四层架构。
问以下问题检测自己是否真的掌握了上述信息?
API Server 架构分几层?
如何跟ETCD进行交互?
k8s消息通知架构和组件分布架构?

(3)k8s应用创建流程和监听机制
在这里插入图片描述
解读信息:
1)
通过命令行创建应用。
即 1.创建 ReplicaSet【创建复制集】
之后会把命令发送到 kube-apiserver这边。
当kube-apiserver收到命令以后,会把创建写到etcd里面。
etcd里面会有一个监听机制,它监听到创建的操作以后,会通知kube-apiserver有创建ReplicaSet事件的操作。
此时对应图中的 3.通知创建ReplicaSet事件。

当有了 创建ReplicaSet事件的操作以后,我们会发送到kube-controller-manager里面,找到复制集的controller进行创建。
与此同时会创建这个副本的监听。即图中的 0.创建ReplicaSet监听。

接下来根据副本的规则来创建POD。此时状态是 5.创建POD。

创建POD之后来到 kube-apiserver这边,记录我们创建POD事件。
POD里面也有监听,就是监听 kube-apiserver etcd 里面 pod 事件的变化,
如果监测到有pod创建,etcd 会通知 kube-apiserver,事件来了,即状态是 7.通知创建POD事件。

创建pod事件会发送到调度器上,即kube-scheduler。
调度器根据它一系列的调度算法,调度我们pod应该部署到哪台机子上。

与此同时也会初始化创建pod监听,即图中的 0.创建POD监听。

创建完了以后,调度器会进行调度, 即图中的 9.调度POD。

调度到到哪个节点上它会告诉 kube-apiserver。

kube-apiserver 会在etcd里面记录调度pod的事件。即图中的10.记录调度POD的事件。

记录完调度POD的事件以后,我们在kubelet上面 会获取 调度POD事件,在实际的node节点上进行更新。
与此同时,也会更新POD监听。 即0.更新POD监听。更新的内容就是POD节点跑在哪个节点上,会把这个信息更新到监听的记录中。

以上就是k8s应用的创建流程以及复制集,POD监听机制是什么样的流程。

核心就是kube-apiserver,etcd充当数据库的角色。

组件是怎么工作的?创建一个应用的流程及监听机制是什么?都要了解清楚。

9.3 k8s 不同种类controller 作用讲解

k8s核心组件——Controller Manager
有哪些种类呢?
(1)副本控制器:Replication Controller。
简称RC控制器。
(2)节点控制器:Node Controller。
(3)资源控制器:Resource Quota Controller。
就是控制我们用户里面能使用多少资源,预分配多少资源给他,都是通过这个控制器来完成的。
(4)命名空间的控制器:Namespace Controller。
(5)Endpoints 控制器:Endpoints Controller。
(6)服务控制器:Server Controller。

接下来介绍它们是干什么的。

1.Replication Controller Manager职责
(1)它稳保当前集群中有些仅有N个POD的实例,N是在RC中定义的POD副本的个数
也就是说你这个应用它要开几个POD,开几个副本都是在这个RC里面定义的。
比如说你这个应用,假设有一个节点上POD挂了,少了一个POD以后,它检测到这个POD少了一个,它会在其他的地方把这个POD启动起来,满足这个副本的个数,就是它稳保的可靠性就是通过RC策略来实现的。

(2)通过调整RC的spec.replicas属性值来实现系统的扩容或者缩容。
(3)通过改变RC中的POD模板(主要是镜像模板)来实现系统的滚动升级。

2.Resource Quota Controller Manager 3个层次资源配额管理
(1)容器级别:可对CPU和Memory进行限制。
(2)POD级别:可对一个POD内所有的容器的可用资源进行限制。
(3)Namespace级别:为Namespace(多租户)级别的资源进行限制,包括:
POD,RC,Service,ResourceQuota,Secret,PV数量。

3.Endpoints Controller 说明
Endpoints Controller 是干什么的呢?
在这里插入图片描述
解读信息:
(1)
在k8s里面接到一个访问的时候,
首先访问到service名称,通过这个service名称,k8s是如何知道我们这个service下面的pod部署在哪台服务器上,包括它里面有哪一些pod,哪些pod的IP,真实的端口是什么,我们就是会用到Endpoints ,来记录这一系列的信息。

这里的服务它是跟Endpoints 和 POD副本进行关联的,就是记录了service下面所有的副本,它在哪里,它在哪台机子上以及在哪台机子上的端口,有一个记录的值。

Endpoints就是来干这个事情的。

4.Service Controller说明
这个 Service Controller 要跟 service 区分开来。
(1)用于监听service的变化
它是来监听service的变化,也就是监听服务的变化。
(2)如果services是一个LoadBalancer类型,则维护LoadBalancer表
LoadBalancer 是负载均衡的意思。
它会维护这个负载均衡的表。

9.4 k8s 安装-阿里云/腾讯云创建ECS

k8s安装要求说明:
(1)至少2台2核4G的服务器
(2)CentOS 7.6/7.7/7.8
(3)安装后的软件版本为:Kubernetes v1.19.x ,Docker 19.03.11

k8s安装说明:
在这里插入图片描述
先访问:https://www.aliyun.com/

然后关键配置截图如下:【截图就是路线图,就是路径,怎么走的】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.5 k8s 安装 服务器基础安装

终于到了实操环节了,鸡冻坏了,在前面的枯燥的理论来回试探…
好极了,我们已经做好了准备,开始吧~

(1)登录服务器
登录方式:ssh root@公网ip_add
登录进来是这样的:
在这里插入图片描述

/*step1:修改主机名
hostnamectl set-hostname master.gogogo.com
查看结果   
hostnamectl status
echo "127.0.0.1 $(hostname)" >> /etc/hosts
按照上述方法另外一台主机做同样的3步配置
hostnamectl set-hostname node1.gogogo.com
查看主机名配置
cat /etc/hosts

*step2:机器检查
所有节点必须保证以下条件:
1.任意节点 centos 版本为 7.6/7.7/7.8
2.任意节点 CPU 内核数量大于等于 2,且内存大于等于 4G
命令:lscpu

3.任意节点 hostname 不是 localhost,且不包含下划线、小数点、大写字母
命令:cat /etc/hosts

4.任意节点都有固定的内网 IP 地址
5.任意节点都只有一个网卡,如果有特殊目的,我可以在完成 K8S 安装后再增加新的网卡
6.任意节点上 Kubelet使用的 IP 地址 可互通(无需 NAT 映射即可相互访问),且没有防火墙、安全组隔离
7.任意节点不会直接使用 docker run 或 docker-compose 运行容器

*/

文件:base_install.sh

#!/bin/bash

# 在 master 节点和 worker 节点都要执行

# 安装 docker
# 参考文档如下
# https://docs.docker.com/install/linux/docker-ce/centos/
# https://docs.docker.com/install/linux/linux-postinstall/

# 卸载旧版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-ce-cli \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

# 设置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装并启动 docker
yum install -y docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13

mkdir /etc/docker || true

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["${REGISTRY_MIRROR}"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

# 安装 nfs-utils
# 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
yum install -y wget

# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p

# 配置K8S的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 卸载旧版本
yum remove -y kubelet kubeadm kubectl

# 安装kubelet、kubeadm、kubectl
# 将 ${1} 替换为 kubernetes 版本号,例如 1.19.0
yum install -y kubelet-${1} kubeadm-${1} kubectl-${1}

# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet

docker version
/*
*step3: base-install.sh 所有节点基础安装
在 master主机上:
(1)复制上文中的 base-install.sh文件内容
(2)vim base-install.sh
 (3)敲 i 进入编辑模式
 (4)cv 粘贴内容
(5)按 esc键
(6)敲 :x 保存并退出
(7)复制粘贴执行以下命令
export REGISTRY_MIRROR=https://registry.cn-shanghai.aliyuncs.com
(8)再执行:
./base_install.sh 1.19.5

在 node1 主机上:
(1)复制上文中的 base-install.sh文件内容
(2)vim base-install.sh
 (3)敲 i 进入编辑模式
 (4)cv 粘贴内容
(5)按 esc键
(6)敲 :x 保存并退出
(7)复制粘贴执行以下命令
export REGISTRY_MIRROR=https://registry.cn-shanghai.aliyuncs.com
(8)再执行:
./base_install.sh 1.19.5
*/

完成结果:
在这里插入图片描述

9.6 k8s 安装初始化Master 节点

文件:init_master.sh

#!/bin/bash

# 只在 master 节点执行

# 脚本出错时终止执行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
  echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
  echo 当前POD_SUBNET=$POD_SUBNET
  echo 当前APISERVER_NAME=$APISERVER_NAME
  exit 1
fi


# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${1}
imageRepository: registry.cn-shanghai.aliyuncs.com/cap1573
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
EOF

# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
kubeadm config images pull --config=kubeadm-config.yaml
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 拉镜像
sudo docker pull calico/node:v3.13.1
sudo docker pull calico/pod2daemon-flexvol:v3.13.1
sudo docker pull calico/cni:v3.13.1
sudo docker pull calico/kube-controllers:v3.13.1

# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安装calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
/* ==========》这一步用的是ECS云服务器的私有的IP。
*step4: 初始化 Master 节点 (只在 Master 节点执行)
(1)设置
在 master 节点执行:
	# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP) 假设是192.168.100.1
	# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
	export MASTER_IP=192.168.100.1
	
	# 替换 apiserver.gogogo.com 为 您想要的 dnsName 
	export APISERVER_NAME=apiserver.gogogo.com
	
	# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中,如果你不知道直接设置如下命令:
	export POD_SUBNET=10.100.0.1/16
	
	# 输出重定向到 /etc/hosts 文件中
	echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
	
	# 查看配置的内容
	cat /etc/hosts

在node1 节点上执行:192.168.100.1 是master节点的私有的IP,注意替换。
	export MASTER_IP=192.168.100.1
	export APISERVER_NAME=apiserver.gogogo.com
	export POD_SUBNET=10.100.0.1/16
	echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
	cat /etc/hosts

在 master 节点上执行:检查执行结果
	# 只在 master 节点执行
	# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
	watch kubectl get pod -n kube-system -o wide
	
	# 查看 master 节点初始化结果
	kubectl get nodes -o wide 
如果状态为pending 则手动拉一下镜像
sudo docker pull calico/node:v3.13.1
sudo docker pull calico/pod2daemon-flexvol:v3.13.1
sudo docker pull calico/cni:v3.13.1
sudo docker pull calico/kube-controllers:v3.13.1
*/

在这里插入图片描述

9.7 k8s node 节点加入集群

/*
*step5: 初始化 Worker 节点
1.首先在 Master 节点上执行以下命令
	# 只在 master 节点执行
	kubeadm token create --print-join-command
	
	可获取kubeadm join 命令及参数,如下所示
	# kubeadm token create 命令的输出,形如:
	kubeadm join apiserver.gogogo.com:6443 --token o5vmo9.bazxuhkyew9rajvi --discovery-token-ca-cert-hash sha256:956583e...
	### 该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点

2.初始化 worker (只在worker 节点执行)
	# 只在 worker 节点执行
	# 替换 x.x.x.x 为 master 节点的内网 IP
	# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
	export MASTER_IP=x.x.x.x
	# 替换 apiserver.gogogo.com 为 您想要的 dnsName 
	export APISERVER_NAME= apiserver.gogogo.com
	echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

3.为了加快速度先在节点上下载镜像
	如果不下载会去docker hub 上下时间会非常长
	sudo docker pull calico/node:v3.13.1
	sudo docker pull calico/pod2daemon-flexvol:v3.13.1
	sudo docker pull calico/cni:v3.13.1
	sudo docker pull calico/kube-controllers:v3.13.1

4.执行 Master 节点上 token 信息加入集群
	# 替换为 master 节点上 kubeadm token create 命令的输出
	kubeadm join apiserver.gogogo.com:6443 --token o5vmo9.bazxuhkyew9rajvi  --discovery-token-ca-cert-hash sha256:9565...

5.检查初始化结果
在 master 节点上执行(只在Master上) 
kubectl get nodes -o wide
*/

在这里插入图片描述

9.8 kompose 介绍和说明

在单台机器管理docker容器是怎么管理的?
是用docker-compose来统一管理的,镜像的配置写在docker-compose.yml文件里。

那k8s里面,可以把已经写好的docker-compose.yml文件直接转化为k8s可以使用的文件。
这是由kompose工具来实现的。

1.kompose介绍
会写docker-compose.yml文件就可以了。

kompose是一个将docker-compose的yaml文件快速转换成k8s能够部署文件的工具。

如何转化呢?
使用条件:
(1)必须有一个已经安装好的k8s集群。
(2)kubectl 命令行工具必须能够连接到搭建好的k8s集群中。
更多参考

kompose Linux和macOS下的安装:
下载地址

# Linux
curl https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-linux-amd64 -o kompose
# macOS
curl https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-darwin-amd64 -o kompose

chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

kompose使用命令:

# 把docker-compose.yml文件 转化为  k8s可使用的文件
kompose -f xxx.yml convert 
# 把已经转化好的文件部署到k8s中去
kubectl apply -f *.yaml

9.9 kubectl 常用命令讲解

kubectl 常用命令分类:
(1)命令式资源管理
(2)资源查看
(3)容器管理

1.命令式资源管理
(1)创建:
create【创建一个资源】
expose(暴露一个资源)
(2)更新:
scale【扩展资源】
label【标签】
annotate【添加备注】
(3)删除
delete(删除资源)

2.资源查看
(1)get
最常用的查看命令,显示1个或多个的详细信息。
(2)describe
describe命令同样用于查看资源信息,
相对于get只输出资源本身的信息,
describe聚合了相关资源的信息并输出。

3.容器管理
(1) log
查看容器的log
(2) exec
执行命令
(3) cp
用于从容器与物理机文件的拷贝

4.kubectl语法

kubectl [command] [type] [name] [flags]

例如:

kubectl get po,svc
kubectl log mysql
kubectl exec -it mysql /bin/bash

5.k8s常用资源的缩写
(1)lng
ingresses的缩写
(2)no
表示集群nodes节点的缩写
(3)ns
namespace命名空间的缩写
(4)rs
replicasets的缩写
(5)svc
代表服务services的缩写
(6)ep
endpoints的缩写

用法例如:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐