容器_Docker ( 04 )
K8S管理
集群管理
集群管理命令
-
kubectl
是用于控制Kubernetes
集群的命令行工具 -
语法格式 :
kubectl [command] [Type] [Name] [flags]
-
command
: 子命令 , 如create , get , describe , delete -
查询集群信息管理命令
子命令 说明 help 用于查看命令及子命令的帮助信息 cluster-info 显示集群的相关配置信息 version 查看服务器及客户端的版本信息 api-resources 查看当前服务器上所有的资源对象 api-versions 查看当前服务器上所有资源对象的版本 config 管理当前节点上kubeconfig 的认证信息 -
type
: 资源类型 ,可以表示为单数 , 复数或缩写形式 -
name
: 资源的名称 , 如果省略 , 则显示所有资源信息 -
flags
: 指定可选标志 , 或附加的参数
-
管理命令示例
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
* 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
为其他主机添加管理权限
- 安装集群管理工具
kubectl
[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
- 拷贝证书到目标主机
- 整数默认路径 :
${HOME}/.kube/config
- 整数默认路径 :
[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
资源对象概述
- 什么是资源对象
- k8s中把可以创建或配置的应用和服务成为资源对象
- 我们在集群中创建的Pod , 负载均衡 , 存储 , 网络服务等等都是资源对象
- 创建资源对象
- 简单资源对象可以使用 “kubectl” 直接创建
- 高级资源对象需要使用 “资源对象文件” 创建
- 查看私有资源对象中的镜像
curl -sku admin https://harbor:443/v2/library/myos/tags/list | python3 -m json.tool
创建 Pod 资源对象
- 使用 run 创建一个 Pod资源对象
kubectl run Pod名称 [选项/参数] --image=镜像名:标签
# 创建 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 !
Pod详解
什么是 Pod
- Pod 就像是豌豆荚一样 名是由一个或多个容器组成
- Pod 是 Kubernetes中最小的管理元素
- Pod 是一个服务的多个进程的聚合单位
- 同一个 Pod 共享网络IP以及权限
- 同一个 Pod 共享主机名称
- 同一个 Pod 共享存储设备
为什么使用Pod
- 服务之间有相关性
- 启动容器的时候需要初始化或进行相关配置
Pod的生命周期
- Pod 对象自从创建开始至终止的时间范围称为其声明周期
- 在这段时间中 , Pod处在多种不同的状态 , 并执行相关操作
- 创建主容器(
main container
)为必须的操作 , 其他为可选操作
Pod相位状态
- Pod的
stastus
字段是一个PodStatus
的对象 , Pod对象总是应该处于其生命进程中以下几个相位(phase
)之一Pending
Pod创建过程中 , 但尚未被调度完成Running
Pod中所有容器都已经被创建成功Completed
Pod所有容器都已经成功终止 , 并不会被重启Failed
Pod中所有容器中至少有一个容器退出是非0状态Unknown
无法正常获取到Pod对象的状态信息
Pod 管理命令
子命令 | 说明 | 备注 |
---|---|---|
run/create | 创建资源对象 | 可输出资源文件模板 |
get | 查看资源对象的状态信息 | 常用参数: -o 显示格式 |
describe | 查询资源对象的属性信息 | |
logs | 查看容器的报错信息 | 常用参数: -c 容器名称 |
kubectl get 语法格式
kubectl get 资源类型 [资源名称] [选项/参数]
- 常用参数
-o name
只显示名字-o wide
显示更加详细的信息-o yaml
以yaml语法格式显示资源对象-o json
以json语法格式显示资源对象namespace
查看命名空间-n kube-system
查看命名空间中的资源对象
- 常用参数
# 查看 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
... ...
kubectl create 语法格式
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
kubectl 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.
kubectl describe 语法格式
kubectl describe 资源类型 [资源名称] [选项/参数]
Events
排错- 查看 pod的错误
# 查看资源对象的属性信息
[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
... ...
kubectl 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
Pod管理命令
子命令 | 说明 | 备注 |
---|---|---|
exec | 在某一个容器内执行特定的命令 | 可选参数: -c 容器名称 |
cp | 在容器和宿主机之间拷贝文件或目录 | 可选参数: -c 容器名称 |
delete | 删除资源对象 | 可选参数: -l 标签 |
kubectl 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)
... ...
kubectl 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
kubectl 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
k8s资源对象管理
资源对象文件
资源文件详解
- 什么是资源对象
Kubernetes
对象是 “目标性记录”kubernetes
使用这些对象去表示整个集群的状态
- 什么是资源对象文件
- 创建 kubernetes 对象时 , 必须提供资源对象的一些基本信息 , 以及描述对象的期望状态特征(规约) , 如果在文件中使用yaml的语法格式描述了上述信息 , 此文件就是资源对象文件
- 为什么要使用资源对象文件
- 命令无法持久化 , 没有历史记录 , 不方便重现
- 服务众多 , 多个容器之间有关联性 , 管理不方便
- 很多高级复杂的功能靠简单的命令方式无法实现 , 这些都需要使用资源文件描述
- 资源对象文件可以创建 , 删除 , 变更 , 管理资源对象
最简单的资源对象文件
- 命名规范 : 使用帕斯卡拼写法 , key使用小驼峰 , value使用大驼峰
[root@master ~]# vim myweb.yaml
--- #Yaml文件起始标志
kind: Pod #当前创建资源的类型
apiVersion: v1 #当前资源对应的版本
metadata: #属性信息 , 元数据
name: myweb #属性信息 , 资源的名称
spec: #资源的特性描述
containers: #容器资源特征描述
- name: webserver #容器名称
image: myos:nginx #启动容器使用的镜像
status: {} #资源状态 , 运行后自动生成
Pod资源对象管理
子命令 | 说明 | 备注 |
---|---|---|
create | 创建文件中定义的资源 | 支持指令式和资源对象文件配置 |
apply | 创建(更新)文件中定义的资源 | 只支持资源对象文件(声明式) |
delete | 删除文件中定义的资源 | 支持指令式和资源对象文件配置 |
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 -
静态Pod(一般不使用)
-
什么是静态Pod
-
静态Pod
是由kubelet
守护进程直接管理的Pod , 不需要API服务器监管 , 与由控制面管理的Pod
不同 -
kubelet
监视每个静态 Pod
(在它崩溃后重启) -
静态Pod
永远都会绑定到一个指定节点上的Kubelet
-
静态Pod
的spec
不能引用其他API
对象 -
静态Pod
配置路径 :/var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/mainfests
-