1.什么是资源清单
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
2.资源清单的格式
apiVersion: group/apiversion # 如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类别
metadata: #资源元数据
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段有kubernetes自身维护,用户不能去定义
配置清单主要有五个一级字段,其中status用户不能定义,由k8s自身维护
3.获取资源的apiVersion版本及资源配置的帮助
1)获取apiVersion版本信息
2)获取资源的apiVersion版本信息
可以看的出来,不同的资源可能属于不同的apiVersion版本
4.资源清单配置
(1) 以pod为例,创建一个简单的yaml文件
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
(2) 在一个pod中创建两个容器
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v1
imagePullPolicy: IfNotPresent
- name: demo
image: reg.westos.org/k8s/busyboxplus
imagePullPolicy: IfNotPresent
[kubeadm@server1 manifest]$ kubectl create -f pod.yaml
pod/myapp created
[kubeadm@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 1/2 CrashLoopBackOff 1 8s
[kubeadm@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 1/2 CrashLoopBackOff 1 16s
[kubeadm@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 1/2 NotReady 3 48s
[kubeadm@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 1/2 NotReady 3 52s
[kubeadm@server1 manifest]$
由于busyboxplus是非交互式的,所以认为容器没有启动,失败了。
编辑文件添加 tty:true
[kubeadm@server1 manifest]$ kubectl create -f pod.yaml
pod/myapp created
[kubeadm@server1 manifest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 2/2 Running 0 21s
[kubeadm@server1 manifest]$
此时这个pod里面有两个容器。
备注:同一个pod里面的容器可以共享网络栈和存储。
连接pod中的一个容器 demo(busyboxplus)
[kubeadm@server1 manifest]$ kubectl exec -it myapp -c demo -- sh
/ #
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # 可以访问到另外一个容器
指定端口映射,进行外部访问
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
[kubeadm@server1 manifest]$ curl server2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[kubeadm@server1 manifest]$ curl server2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[kubeadm@server1 manifest]$
[root@foundation8 kiosk]# curl server2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation8 kiosk]# curl server2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation8 kiosk]#
测试resources参数
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
resources:
limits:
memory: 100M
requests:
memory: 50M
指定pod的运行节点 (这里指定为server3)
[kubeadm@server1 manifest]$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
server1 Ready master 18h v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
server2 Ready <none> 18h v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server2,kubernetes.io/os=linux
server3 Ready <none> 18h v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server3,kubernetes.io/os=linux
[kubeadm@server1 manifest]$
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
nodeSelector:
kubernetes.io/hostname: server3
测试hostNetwork参数
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: reg.westos.org/k8s/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
nodeSelector:
kubernetes.io/hostname: server3
hostNetwork: true
此时不能在该pod上启动占用80端口的容器