K8s(资源管理,namespace,Pod)
介绍在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Po
介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod
中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器
来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service
资源实现这个功能。
当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储
系统。
YAML语言介绍
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
<xiaowang>
<age>21</age>
<address>Beijing</address>
</heima>
xiaowang:
age: 21
address: Beijing
YAML的语法比较简单,主要有下面几个:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格( 低版本限制 )
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
YAML支持以下几种数据类型:
- 纯量:单个的、不可再分的值
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型
c4: ~ # 使用~表示null
# 5 日期类型
c5: 2018-02-17 # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
c7: xiaowang # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹
c8: line1
line2 # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
# 对象
# 形式一(推荐):
xiaowang:
age: 21
address: Beijing
# 形式二(了解):
xiaowang: {age: 21,address: Beijing}
# 数组
# 形式一(推荐):
address:
- 成都
- 深圳
# 形式二(了解):
address: [成都,深圳]
k8s资源管理的方式
- 命令式对象管理:直接使用命令去操作kubernetes资源
# kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool][--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
[root@master ~]# kubectl run nginx-pod --image=nginx:1.17.1 --port=80
- 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
- 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源(支持对一个目录下的所有文件yaml文件进行操作)
kubectl apply -f nginx-pod.yaml
kubectl apply -f ./
k8s的资源类型
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
资源分类 | 资源名称 | 缩写 | 资源作用 |
---|---|---|---|
集群级别资源 | nodes | no | 集群组成部分 |
namespaces | ns | 隔离Pod | |
pod资源 | pods | po | 装载容器 |
pod资源控制器 | replicationcontrollers | rc | 控制pod资源 |
replicasets | rs | 控制pod资源 | |
deployments | deploy | 控制pod资源 | |
daemonsets | ds | 控制pod资源 | |
jobs | 控制pod资源 | ||
cronjobs | cj | 控制pod资源 | |
horizontalpodautoscalers | hpa | 控制pod资源 | |
statefulsets | sts | 控制pod资源 | |
服务发现资源 | services | svc | 统一pod对外接口 |
ingress | ing | 统一pod对外接口 | |
存储资源 | volumeattachments | 存储 | |
persistentvolumes | pv | 存储 | |
persistentvolumeclaims | pvc | 存储 | |
配置资源 | configmaps | cm | 配置 |
secrets | 配置 |
经常使用的操作有下面这些:
- 创建一个namespace
[root@master ~]# kubectl create namespace dev
namespace/dev created
- 获取namespace
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 9h
dev Active 28s
kube-node-lease Active 9h
kube-public Active 9h
kube-system Active 9h
- 在此namespace下创建并运行一个nginx的Pod
[root@master ~]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created
- 查看新创建的pod
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod-644584df94-rxczl 1/1 Running 0 34s
- 删除指定的pod
[root@master ~]# kubectl delete pods pod-644584df94-rxczl -n dev
pod "pod-644584df94-rxczl" deleted
- 删除指定的namespace
[root@master ~]# kubectl delete ns dev
"dev" deletednamespace "dev" deleted
命令式对象配置(yaml文件格式)
- 创建一个pod-nginx.yaml
# 先创建一个为dev的namespace,然后在namespace中创建一个带有nginx服务的Pod
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:latest
- 执行create命令,创建资源:
[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
- 执行get命令,查看资源
[root@master ~]# kubectl get -f pod-nginx.yaml
NAME STATUS AGE
namespace/dev Active 10s
NAME READY STATUS RESTARTS AGE
pod/nginxpod 1/1 Running 0 9s
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 27s
- 执行delete命令,删除资源
[root@master ~]# kubectl delete -f pod-nginx.yaml
namespace "dev" deleted
pod "nginxpod" deleted
namespace
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
- 集群启动之后,会默认创建几个namespace
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13开始引入
kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间
- 查看所有的namespace
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 13h
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
- 查看指定的namespace
[root@master ~]# kubectl get ns kube-system
NAME STATUS AGE
kube-system Active 13h
- 指定输出格式
kubernetes支持的格式有很多,比较常见的是wide、json、yaml
命令:kubectl get ns ns名称 -o 格式参数
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2022-05-08T15:49:06Z"
name: default
resourceVersion: "146"
selfLink: /api/v1/namespaces/default
uid: 432c901d-bd6d-4d6c-af80-184403dc1f30
spec:
finalizers:
- kubernetes
status:
phase: Active
- 查看namespace详情
查看ns详情 命令:kubectl describe ns ns名称
[root@master ~]# kubectl describe ns default
Name:
- 创建一个namespace
[root@master ~]# kubectl create ns dev
namespace/dev created
- 删除一个namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted
- yaml文件配置
[root@master ~]# cat namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
# 创建一个namespace
[root@master ~]# kubectl create -f namespace.yaml
namespace/dev created
# 删除一个namespace
[root@master ~]# kubectl delete -f namespace.yaml
namespace "dev" deleted
Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的!
[root@master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-tfs4f 0/1 Running 1 13h
coredns-9d85f5447-zzvn2 0/1 Running 1 13h
etcd-master 1/1 Running 2 13h
kube-apiserver-master 1/1 Running 2 13h
kube-controller-manager-master 1/1 Running 2 13h
kube-flannel-ds-94qzl 1/1 Running 1 13h
kube-flannel-ds-cv6nz 1/1 Running 1 13h
kube-flannel-ds-l9l9t 1/1 Running 1 13h
kube-proxy-hmlgc 1/1 Running 1 13h
kube-proxy-v2mck 1/1 Running 2 13h
kube-proxy-zp2g5 1/1 Running 1 13h
kube-scheduler-master 1/1 Running 2 13h
创建并运行pod
命令格式: kubectl run (pod控制器名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
查看pod信息
# 查看pod的基本信息
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-dd6b5d745-ggw95 1/1 Running 0 47s
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-dd6b5d745-ggw95 1/1 Running 0 63s 10.20.1.7 node01 <none> <none>
## 查看Pod的详细信息
[root@master ~]# kubectl describe pods -n dev
Name: nginx-dd6b5d745-ggw95
Namespace: dev
Priority: 0
Node: node01/192.168.0.18
Start Time: Mon, 09 May 2022 13:05:04 +0800
Labels: pod-template-hash=dd6b5d745
run=nginx
Annotations: <none>
Status: Running
IP: 10.20.1.7
IPs:
IP: 10.20.1.7
Controlled By: ReplicaSet/nginx-dd6b5d745
Containers:
nginx:
Container ID: docker://f9f03c480229a7f5b715d69758cd420ab9c8853f5dd9004cad0c7c25d81d319d
Image: nginx:latest
Image ID: docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 09 May 2022 13:05:06 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-m6twv (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-m6twv:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-m6twv
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 73s default-scheduler Successfully assigned dev/nginx-dd6b5d745-ggw95 to node01
Normal Pulling 72s kubelet, node01 Pulling image "nginx:latest"
Normal Pulled 71s kubelet, node01 Successfully pulled image "nginx:latest"
Normal Created 71s kubelet, node01 Created container nginx
Normal Started 71s kubelet, node01 Started container nginx
访问Pod
[root@master ~]# curl http://10.20.1.7:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
删除指定Pod
# 删除指定的Pod
[root@master ~]# kubectl delete pods nginx-dd6b5d745-ggw95 -n dev
pod "nginx-dd6b5d745-ggw95" deleted
# 此时,显示删除Pod成功,但是再查询,发现又新产生了一个
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-dd6b5d745-lm4t5 1/1 Running 0 58s
这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建!此时要想删除Pod,必须删除Pod控制器
# 先来查询一下当前namespace下的Pod控制器
[root@master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 7m31s
# 删除此PodPod控制器
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
# 查询Pod,发现Pod被删除了
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.
yaml配置操作
创建一个pod-nginx.yaml文件,
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:latest
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
- 执行命令
创建:kubectl create -f pod-nginx.yaml
删除:kubectl delete -f pod-nginx.yaml
更多推荐
所有评论(0)