容器编排学习(一)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  核心架构

容器编排学习(一)k8s集群管理_第1张图片

master (管理节点)

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

容器编排学习(一)k8s集群管理_第2张图片

核心组件

API Server 

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

Scheduler

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

ControllerManager

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

etcd

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

服务端口

容器编排学习(一)k8s集群管理_第3张图片

软件工具包

kubeadm:集群配置工具

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

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

contained:容器管理软件(Runtime)

ipvsadm:集群管理工具

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

node      (计算节点)

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

容器编排学习(一)k8s集群管理_第4张图片

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              22h   v1.26.0
node-0002   Ready              22h   v1.26.0
node-0003   Ready              22h   v1.26.0
node-0004   Ready              22h   v1.26.0
node-0005   Ready              22h   v1.26.0

五  Pod

1  概述

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

Pod 是Kubernetes中最小的管理元素

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

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

同一个 Pod 共享主机名称

同一个 Pod 共享存储设备

2  创建过程

容器编排学习(一)k8s集群管理_第5张图片

为什么要使用Pod?

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

3  生命周期

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

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

容器编排学习(一)k8s集群管理_第6张图片

容器编排学习(一)k8s集群管理_第7张图片

4  相位状态

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

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

容器编排学习(一)k8s集群管理_第8张图片

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  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 - 

你可能感兴趣的:(Kubernetes,容器编排学习,kubernetes,linux,服务器,运维,容器,云原生,学习)