容器编排学习(一)k8s集群管理

一 Kubernetes

1 概述

就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的一一编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理就在这个时候,kubernetes出现了

kubernetes的名字来自希腊语,意思是舵手或领航员k8s是将k和s之间的8个字母ubernete替换为8的缩写

k8s的创造者,是众人皆知的行业巨头一Google。k8s并不是一件全新的发明,他是Google10多年大规模容器管理技术Borg的开源版本。2014年6月k8s由Google公司正式公布出来并宣布开源

k8s 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能

2 核心架构

master (管理节点)

  • 提供集群的控制
  • 对集群进行全局决策
  • 检测和响应集群事件

核心组件

API Server

  • 是整个系统的对外接口,供客户端和其它组件调用
  • 后端元数据存储于etcd中(键值数据库)

Scheduler

  • 负责对集群内部的资源进行分配和调度

ControllerManager

  • 负责管理控制器,相当于大总管

etcd

  • 存储kubernetes在运行过程中产生的所有元数据

服务端口

软件工具包

kubeadm:集群配置工具

kubelet:管理pod,在集群中的每个节点上启动

kubectl:用来与集群通信的命令行工具

contained:容器管理软件(Runtime)

ipvsadm:集群管理工具

iproute-tc:网络流量管理工具

node (计算节点)

  • 运行容器的实际节点
  • 提供运行环境
  • 在多个节点上运行
  • 水平扩展

Node核心组件

Kubelet

  • 负责监视Pod、包括创建、修改、删除等

Kube-proxy

  • 主要负责为Pod对象提供代理
  • 实现service的通信与负载均衡

Runtime

  • 容器管理(contained )

image (镜像仓库)

  • 存储镜像
  • 为节点提供镜像支持

仓库组件:Registry 或 Harbor

二 calico

1 概述

在虚拟化平台中,比如 OpenStack、Docker 等都需要实现workloads 之间互连,但同时也需要对容器做隔离控制,设置访问策略,calico 就可以解决以上所有问题

calico 可以让不同节点上的容器实现互联互通,同时也可以设置访问策略,它是一种容器之间网络互通的解决方案

2 优势

更节约资源:Calico 使用的三层路由方法,抑制二层广播减少了资源开销,并且具有可扩展性。

更容易管理:因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,更容易管理

更少的依赖: Calico 仅依赖三层路由可达

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

三 kubeadm

常用选项

|---------|-----------|
| 命令选项 | 命令说明 |
| help | 命令帮助信息 |
| version | 版本信息 |
| config | 镜像管理命令 |
| init | 集群初始化命令 |
| reset | 还原、删除集群配置 |
| join | 计算节点加入集群 |
| token | token凭据管理 |

四 集群管理命令

kubectl 是用于控制 Kubernetes 集群的命令行工具

1 语法格式

kubectl [command] [TYPE] [NAME] [flags]

command:子命令,如create,get,describe,delete

type:资源类型,可以表示为单数,复数或缩写形式

name:资源名称,如果省略,则显示所有资源信息

flags:指定可选标识或附加的参数

2 集群信息管理命令

子命令 说明 备注
help 用于查看命令及子命令的帮助信息
cluster-info 显示集群的相关配置信息
version 查看服务器及客户端的版本信息
api-resources 查看当前服务器上所有的资源对象
api-versions 查看当前服务器上所有资源对象的版本
config 管理当前节点上kubeconfig 的认证信息

help

复制代码
# 查看帮助命令信息
[root@master ~]# kubectl help version
Print the client and server version information for the current context.

Examples:
  # Print the client and server versions for the current context
  kubectl version
... ...

cluster-info

复制代码
# 查看集群状态信息
[root@master ~]# kubectl cluster-info 
Kubernetes control plane is running at https://192.168.1.50:6443
CoreDNS is running at https://192.168.1.50:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

version

复制代码
# 查看服务端与客户端版本信息
[root@master ~]# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:58:30Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:51:45Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}

api-resources

复制代码
# 查看资源对象类型
[root@master ~]# kubectl api-resources 
NAME             SHORTNAMES     APIVERSION      NAMESPACED      KIND
bindings                        v1              true            Binding
endpoints        ep             v1              true            Endpoints
events           ev             v1              true            Event
... ...

api-versions

复制代码
# 查看资源对象版本
[root@master ~]# kubectl api-versions 
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
... ...

config

复制代码
# 查看当前认证使用的用户及证书
[root@master ~]# kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   
# 使用 view 查看详细配置
[root@master ~]# kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.1.50:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

主机管理授权

复制代码
[root@harbor ~]# vim /etc/hosts
192.168.1.30    harbor
192.168.1.50    master
192.168.1.51    node-0001
192.168.1.52    node-0002
192.168.1.53    node-0003
192.168.1.54    node-0004
192.168.1.55    node-0005
[root@harbor ~]# dnf install -y kubectl
[root@harbor ~]# mkdir -p $HOME/.kube
[root@harbor ~]# rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
[root@harbor ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@harbor ~]# kubectl get nodes
NAME        STATUS   ROLES           AGE   VERSION
master      Ready    control-plane   24h   v1.26.0
node-0001   Ready    <none>          22h   v1.26.0
node-0002   Ready    <none>          22h   v1.26.0
node-0003   Ready    <none>          22h   v1.26.0
node-0004   Ready    <none>          22h   v1.26.0
node-0005   Ready    <none>          22h   v1.26.0

五 Pod

1 概述

Pod 就像是豌豆英一样,它由一个或者多个容器组成

Pod 是Kubernetes中最小的管理元素

Pod 是一个服务的多个进程的聚合单位

安同一个 Pod共享网络IP及权限

同一个 Pod 共享主机名称

同一个 Pod 共享存储设备

2 创建过程

为什么要使用Pod?

  • 服务之间有相关性
  • 启动容器的时候需要初始化或进行相关配置

3 生命周期

Pod 对象自从创建开始至终止的时间范围称为其生命周期,在这段时间中Pod 处在多种不同的状态,并执行相关操作

创建主容器为必需的操作,其他为可选操作(初始化容器启动后钩子、存活性探测、就绪性探测以及终止前钩子等

4 相位状态

Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命进程中以下几个相位 (phase) 之一

|-----------|--------------------------|
| Pending | Pod 创建过程中,但它尚未被调度完成 |
| Running | Pod中所有容器都已经被创建成功 |
| Completed | Pod 所有容器都已经成功终止,并不会被重启 |
| Failed | Pod中的所有容器中至少有一个容器退出是非0状态 |
| Unknown | 无法正常获取到Pod对象的状态信息 |

3 Pod核心管理命令(一)

|------------|-------------|---------------|
| 子命令 | 说明 | 备注 |
| run/create | 创建资源对象 | 可输出资源文件模板 |
| get | 查看资源对象的状态信息 | 常用参数: -o 显示格式 |
| describe | 查询资源对象的属性信息 | |
| logs | 查看容器的报错信息 | 常用参数: -c 容器名称 |

run

复制代码
# 创建 Pod
[root@master ~]# kubectl run myweb --image=myos:nginx
pod/myweb created

# 查询资源对象
[root@master ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE
myweb   1/1     Running   0          3s    10.244.1.3   node-0001

[root@master ~]# curl http://10.244.1.3
Nginx is running !

get

语法格式:kubectl get 资源类型 [资源名称] [选项/参数]

常用参数:

-o name 只显示名字

-o wide 显示更加的详细信息

-o yaml 以 Yaml 语法格式显示资源对象

-o json 以 json 语法格式显示资源对象

复制代码
# 查看 Pod 资源对象
[root@master ~]# kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
myweb    1/1     Running   0          10m
# 只查看资源对象的名字
[root@master ~]# kubectl get pods -o name
pod/myweb
# 查看资源对象运行节点的信息
[root@master ~]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE
myweb    1/1     Running   0          10m   10.244.1.3   node-0001
# 查看资源对象详细信息,Yaml 格式
[root@master ~]# kubectl get pod myweb -o yaml
apiVersion: v1
kind: Pod
metadata:
  name: myweb
... ...
# 查看名称空间
[root@master ~]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   39h
kube-node-lease   Active   39h
kube-public       Active   39h
kube-system       Active   39h

# 查看 kube-system 名称空间中的 Pod 信息
[root@master ~]# kubectl -n kube-system get pods
NAME                             READY   STATUS    RESTARTS      AGE
etcd-master                      1/1     Running   0             39h
kube-apiserver-master            1/1     Running   0             39h
kube-controller-manager-master   1/1     Running   0             39h
kube-scheduler-master            1/1     Running   0             39h
... ...

create

系统命名空间

default 默认的命名空间,不声明命名空间的Pod都在这里

kube-node-lease 为高可用提供心跳监视的命名空间

kube-public 公共数据,所有用户都可以读取它

kube-system 系统服务对象所使用的命名空间

注意:k8s 系统核心服务都运行在 kube-system 名称空间中

语法格式:kubectl create <资源对象> [选项/参数]

复制代码
# 创建名称空间资源对象
[root@master ~]# kubectl create namespace work
namespace/work created

# 查看名称空间
[root@master ~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   39h
kube-node-lease   Active   39h
kube-public       Active   39h
kube-system       Active   39h
work              Active   11s

run

语法格式:kubectl run pod名称 [选项/参数]

复制代码
# 创建简单 Pod 资源对象
[root@master ~]# kubectl -n work run myhttp --image=myos:httpd
pod/myhttp created

# 查询资源对象
[root@master ~]# kubectl -n work get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE
myhttp   1/1     Running   0          3s    10.244.2.2   node-0002

# 访问验证
[root@master ~]# curl http://10.244.2.2
Welcome to The Apache.

describe

语法格式:kubectl describe 资源类型 [资源名称] [选项/参数]

Events 下是事务日志,常用于排错

复制代码
# 查看资源对象的属性信息
[root@master ~]# kubectl describe pod myweb
Name:             myweb
Namespace:        default
Priority:         0
Service Account:  default
Node:             node-0001/192.168.1.51
... ...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  16m   default-scheduler  Successfully assigned default/myweb to node-0001
  Normal  Pulled     16m   kubelet            Container image "myos:nginx" already present on machine
  Normal  Created    16m   kubelet            Created container myweb
  Normal  Started    16m   kubelet            Started container myweb

# 查看 work 名称空间下的 pod 信息
[root@master ~]# kubectl -n work describe pod myhttp
Name:             myhttp
Namespace:        work
Priority:         0
Service Account:  default
Node:             node-0002/192.168.1.52
... ...

logs

语法格式:kubectl logs Pod名称 [选项/参数]

复制代码
# 访问服务,并查看日志
[root@master ~]# curl http://10.244.1.3/info.php
[root@master ~]# curl http://10.244.2.2/info.php
... ...
# 查看 myweb 日志
[root@master ~]# kubectl logs myweb 
2022/11/12 18:28:54 [error] 7#0: *2 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 10.244.0.0, server: localhost, request: "GET /info.php HTTP/1.1", host: "10.244.2.12"
# 查看 myhttp 日志
[root@master ~]# kubectl -n work logs myhttp
[root@master ~]# 

排错三兄弟

kubectl get、kubectl describe、kubectl logs

4 Pod核心管理命令(二)

子命令 说明 备注
exec 在某一个容器内执行特定的命令 可选参数: -c 容器名称
cp 在容器和宿主机之间拷贝文件或目录 可选参数: -c 容器名称
delete 删除资源对象 可选参数: -l 标签

exec

语法格式:kubectl exec [选项/参数] Pod名称 --操作命令

常用参数:-it 分配交互式终端

复制代码
# 在容器内执行命令
[root@master ~]# kubectl exec myweb -- ls 
50x.html
index.html
[root@master ~]# kubectl exec -it myweb -- /bin/bash
[root@myweb html]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.1.3  netmask 255.255.255.0  broadcast 10.244.2.255
        ether 3a:32:78:59:ed:25  txqueuelen 0  (Ethernet)
... ...

cp

语法格式:kubectl cp [选项/参数] 原文件 目标文件

路径格式:[Pod名称:绝对路径]

复制代码
# 与容器进行文件或目录传输
[root@master ~]# kubectl cp myweb:/etc/yum.repos.d /root/aaa
tar: Removing leading `/' from member names
[root@master ~]# tree /root/aaa
/root/aaa
├── local.repo
├── Rocky-AppStream.repo
├── Rocky-BaseOS.repo
└── Rocky-Extras.repo

0 directories, 4 files
[root@master ~]# kubectl -n work cp /etc/passwd myhttp:/root/mima
[root@master ~]# kubectl -n exec myweb -- ls /root/
mima

delete

集群中所有资源均可使用 delete 命令删除

语法格式:kubectl delete [选项/参数] 资源类型 资源名称

复制代码
# 删除资源对象
[root@master ~]# kubectl delete pods myweb 
pod "myweb" deleted

# 删除 work 名称空间下所有 Pod 对象
[root@master ~]# kubectl -n work delete pods --all
pod "myhttp" deleted

# 删除名称空间
[root@master ~]# kubectl delete namespaces work 
namespace "work" deleted

六 资源对象文件

1 概述

k8s中把可以创建或配置的应用和服务称为资源对象。Kubernetes 对象是"目标性记录",使用这些对象去表示整个集群的状态。我们在集群中创建的 Pod、负载均衡、存储、网络服务等等都是资源对象,创建 Kubernetes 对象时,必须提供资源对象的一些基本信息(例如:资源的对象的名字),以及描述描述该对象的期望状态特征(规约),如果我们在文件中使用 Yaml 的语法格式描述了上面的信息,这个文件就是资源对象文件

为什么要使用资源对象文件?

  • 命令无法持久化,没有历史记录,不方便重现
  • 服务众多,多个容器之间有关联性,管理不方便
  • 很多高级的复杂的功能靠简单的命令方式无法实现,这些都需要使用资源文件描述

2 作用

可以创建、删除、变更、管理资源对象

3 创建

简单资源对象可以使用"kubectI"直接创建

高级资源对象需要使用"资源对象文件"创建

4 最简单的资源对象文件

复制代码
[root@master ~]# vim myweb.yaml
---                      # Yaml文件起始标志
kind: Pod                # 当前创建资源的类型
apiVersion: v1           # 当前资源对应的版本
metadata:                # 属性信息,元数据
  name: myweb            # 属性信息,资源的名称
spec:                    # 资源的特定描述
  containers:            # 容器资源的特定描述
  - name: webserver      # 容器的名称
    image: myos:nginx    # 启动容器使用的镜像
status: {}               # 资源状态,运行后自动生成

5 静态Pod

静态 Pod 是由 kubelet 守护进程直接管理的 Pod,不需要AP|服务器监管。与由控制面管理的 Pod 不同

kubelet 监视每个静态 Pod(在它崩溃之后重新启动)

静态 Pod 永远都会绑定到一个指定节点上的 Kubelet

静态Pod的spec不能引用其他 API对象

静态 Pod 配置路径: /var/lib/kubelet/config.yaml

6 资源文件管理命令

子命令 说明 备注
create 创建文件中定义的资源 支持指令式和资源对象文件配置
apply 创建(更新)文件中定义的资源 只支持资源对象文件(声明式)
delete 删除文件中定义的资源 支持指令式和资源对象文件配置

注意:删除Pod后kubelet会自动重建Pod,删除资源文件才能彻底删除Pod

列如:rm -f /etc/kubernetes/manifests/myweb.yaml

命令语法:kubectl [create|apply|delete] -f 资源文件名称.yaml

create

复制代码
# 创建资源对象
[root@master ~]# kubectl create -f myweb.yaml 
pod/myweb created
# 不能更新,重复执行会报错
[root@master ~]# kubectl create -f myweb.yaml 
Error from server (AlreadyExists): error when creating "myweb.yaml": pods "myweb" already exists

delete

复制代码
# 使用资源对象文件删除
[root@master ~]# kubectl delete -f myhttp.yaml
pod "myhttp" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.

apply

复制代码
# 创建资源对象
[root@master ~]# kubectl apply -f myweb.yaml 
pod/myweb created
# 更新资源对象
[root@master ~]# kubectl apply -f myweb.yaml 
pod/myweb configured
# 删除资源对象
[root@master ~]# kubectl delete -f myweb.yaml 
pod "myweb" deleted

# 拓展提高
# 与 kubectl apply -f myweb.yaml 功能相同
[root@master ~]# cat myweb.yaml |kubectl apply -f - 
相关推荐
梦幻精灵_cq19 分钟前
『专利好药用力心脑血管健康』——爱上古中医(28)(健康生活是coder抒写优质代码的前提条件——《黄帝内经》伴读学习纪要)
学习
指针刺客22 分钟前
储能变流器学习之MPPT
学习
为了摸鱼而战27 分钟前
Docker-compose知识点梳理,你要懂的都在这
docker·容器
YC运维28 分钟前
Ansible模块
java·服务器·前端
Go 鹏ya33 分钟前
【Python学习笔记】whl包打包
笔记·python·学习
程序员白话33 分钟前
使用Kubeadm在Ubuntu22引导部署K8s公网集群
云原生·kubernetes
博语小屋35 分钟前
程序(进程)地址空间(1)
linux
yunyi35 分钟前
使用acme.sh来实现自动化申请和续订TLS证书
linux·nginx·docker
包达叔1 小时前
docker国内镜像源
运维·docker·容器
未来可期LJ1 小时前
【Linux 小实战】自定义 Shell 的编写
linux·服务器