目录
基础指令
Yaml语法解析
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
创建命名空间
vim test.yaml
apiVersion: v1
kind: Namespace
metadata:
name: aren
kubectl apply -f test.yaml
# 如果通过命令行创建
$ kubectl create namespace webserver
# 删除名称空间[注意,这将删除名称空间下的所有资源]
$ kubectl delete namespace webserver
Pod
pod是如何被创建的
-
step1: kubectl 向 k8s api server 发起一个create pod 请求
-
step2: k8s api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml。
-
step3: apiserver 将刚才的yaml信息写入etcd数据库。
-
step4: scheduler 查看 k8s api,判断:pod.spec.Node == null,若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最适合的node。并更新数据库
-
step5: node节点上的Kubelet通过监听数据库更新,发现有新的任务与自己的node编号匹配,则进行任务创建
1.创建一个pod
创建pod模板
kubectl run [pod名称] --image=mysql --namespace=aren --port=3306 --dry-run -o yaml
[root@kube-master kubernetes]# vim mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql
namespace: aren
labels:
name: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "test"
2.创建一个多容器pod
[root@kube-master kubernetes]# vim test.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: aren
labels:
name: nginx
spec:
restartPolicy: OnFailure
containers:
- name: centos
imagePullPolicy: IfNotPresent
image: 10.36.192.206:8088/library/centos:7.9.2009
command: ["tail","-f","/dev/null"]
- name: nginx
imagePullPolicy: IfNotPresent
image: 10.36.192.206:8088/library/nginx:1.20.2
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
# nodeName: kube-node1
nodeSelector:
kubernetes.io/hostname: kube-node2
kubectl apply -f test.yaml
进入容器
-n 指定命名空间 -c 指定pod中的容器
[root@kube-master ~]# kubectl exec -it -n aren nginx -c centos /bin/bash
3.配置节点标签
添加标签
kubectl label nodes node3 name=value
删除标签
kubectl label nodes node3 name-
[root@kube-master ~]# kubectl label nodes kube-node1 type=cpus
可以通过 nodeSelector:(节点选择器:可以指定node的标签,查看标签指令:)
nodeSelector:
type=cpus
4.Pod容器的交互
4.1创建pod,并做本地解析
[root@kube-master ~]# vim host-alias.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: centos
name: centos
namespace: default
spec:
containers:
- image: 10.36.192.206:8088/library/centos:7.9.2009
name: centos
command:
- "tail"
- "-f"
- "/dev/null"
hostAliases:
- ip: "192.168.134.166"
hostnames:
- "kube-node1"
- ip: "192.168.134.163"
hostnames:
- "kube-node2"
# kubectl apply -f host-alisa.yaml
# 字段解析
command:
启动容器时执行的指令,类似于docker run -it 镜像 tail -f /dev/null
hostAliases:
在容器中的/etc/hosts文件中配置本地解析
进入容器可以看到
4.2pod共享进程
shareProcessNamespace: true #共享进程名称空间
[root@kube-master ~]# vim pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: website
labels:
app: website
namespace: aren
spec:
shareProcessNamespace: true
containers:
- name: test-web
image: 10.36.192.206:8088/library/nginx:1.20.2
ports:
- containerPort: 80
- name: busybox
image: 10.36.192.206:8088/library/busybox
stdin: true
tty: true
# kubectl apply -f pod.yaml
可以在busybbox中看到nginx的进程
4.3pod共享宿主机namespace
定义了共享宿主机的 Network、IPC 和 PID Namespace。这样,此 Pod 里的所有容器,会直接使用宿主机的网络、直接与宿主机进行 IPC 通信、看到宿主机里正在运行的所有进程。
[root@kube-master ~]# vim pod1.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: website
labels:
app: website
spec:
hostNetwork: true
hostIPC: true
hostPID: true
containers:
- name: test-web
image: 10.36.192.206:8088/library/nginx:1.20.2
ports:
- containerPort: 80
- name: busybox
image: 10.36.192.206:8088/library/busybox
stdin: true
tty: true
# kubectl apply -f pod1.yaml
查看详信息 ,发现与kube-node1共享
5.钩子函数lifecycle
实例
[root@kube-master ~]# vim lifecycle.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-lifecycle
namespace: default
labels:
app: nginx
spec:
containers:
- name: nginx-lifecycle
image: nginx:1.16.1
ports:
- containerPort: 80
protocol: TCP
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo '<h1>this is a nginx-lifecycle test page</h1>' > /usr/share/nginx/html/index.html"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo 'stop nginx 30 ' > /usr/share/nginx/html/index.html; sleep 30"]
# kubectl apply -f lifecycle.yaml
查看
[root@kube-master kubernetes]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-lifecycle 1/1 Running 0 10s 10.244.9.98 kube-node1 <none> <none>
[root@kube-master kubernetes]# curl 10.244.9.98
<h1>this is a nginx-lifecycle test page</h1>
#删除pod
[root@kube-master kubernetes]#kubectl delete pod nginx-lifecycle -n default
[root@kube-master ~]# curl 10.244.9.98
stop nginx 30