vlambda博客
学习文章列表

第9关 项目部署 完成闭环 k8s初窥门径

适当的焦虑能够帮你不断的成长,当你没有目标的时候,会比过度焦虑更可怕,人往往是在发展中被淘汰的。——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主机负责对节点进行控制。

(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)组件分布图

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

解读信息:问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控制器等等,我们后面会介绍。

(c) 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。

(c) 调度器:kube-scheduler 容器怎么去运行,在哪儿运行,都是通过调度器和调度算法进行计算的。

(d) 配置中心:etcd 可以单机部署,也可以以集群的方式部署。

(e) 集群管理工具:kubectl 使用率很高。

(f) 节点POD管家:kubelet 工作节点,管理docker容器、POD。

(g) 服务外部代理:kube-proxy 反向代理。

(2)每个组件里有什么 

(a)

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

解读信息:组成解读:

api层有:

核心api,分组api,

健康检查,日志,

看板,性能度量,

OpenAPI【swagger api】。

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

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

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

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

(3)k8s应用创建流程和监听机制

第9关 项目部署 完成闭环 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 是干什么的呢?

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

解读信息:

(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安装说明:

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

先访问:https://www.aliyun.com/然后关键配置截图如下:【截图就是路线图,就是路径,怎么走的】

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述
第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述
第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述
第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述
第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

9.5    k8s 安装 服务器基础安装

终于到了实操环节了,鸡冻坏了,在前面的枯燥的理论来回试探... 

好极了,我们已经做好了准备,开始吧~

(1)登录服务器 登录方式:ssh root@公网ip_add 登录进来是这样的:

第9关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述
/*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关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

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关 项目部署 完成闭环 k8s初窥门径
在这里插入图片描述

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集群中。 更多参考

# 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的缩写

用法例如:

在这里插入图片描述