资源对象的配置格式
- API server接受和返回的所有JSON对象都遵循同一个模式,它们都具有“kind”和“apiVersion”字段,用于标识对象所属的资源类型、API群组及相关的版本
- 大多数的对象或列表类型的资源还需要具有三个嵌套型的字段metadata、spec和status
(1)metadata字段为资源提供元数据信息,例如名称、隶属的名称空间和标签等;
(2)spec用于定义用户期望的状态,不同的资源类型,其状态的意义各有不同,例如Pod资源最为核心的功能在于运行容器;
(3)status则记录着活动对象的当前状态信息,它由Kubernetes系统自行维护,对用户来说为只读字段;
- “kubectl api-resources”命令可以获取集群支持使用的所有资源类型
资源对象的管理方式
默认情况下,k8s集群没有运行任何资源,那资源从何而来?可通过kubectl客户端工具控制的,比如kubectl create等。
kubectl的命令可分为三类:
- 陈述式命令:使用run、expose、delete和get等命令,它们直接作用于Kubernetes系统上的活动对象,简单易用,但不支持代码复用、修改复审及审计日志等功能,这些功能的实现通常要依赖于资源配置文件中,这些文件也被称为资源清单。
- 陈述式对象配置:使用yaml/json格式定义资源的期望状态。
- 声明式对象配置:使用apply的方式,完成增删改的所有操作,一般是增和改;而删除使用delete 。
# 查看yaml配置文件得格式,注意定义时也要是这种格式
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1 #版本
kind: Namespace #类型 一般类型得首字母需要大写
metadata: #元数据,这是一个内嵌得字段
creationTimestamp: "2020-11-05T09:44:43Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:status:
f:phase: {}
manager: kube-apiserver
operation: Update
time: "2020-11-05T09:44:43Z"
name: default #名字
resourceVersion: "155"
selfLink: /api/v1/namespaces/default
uid: 17e0574c-6708-4dda-9ca1-637c2ef36e21
spec: #期望得状态 这个字段可留空 可以不写
finalizers:
- kubernetes
status:
陈述式对象配置
使用资源清单创建名称空间,namespace属于集群级别的资源
[root@master ~]# mkdir manifests
[root@master ~]# cd manifests/
[root@master manifests]# mkdir basic
[root@master manifests]# cd basic/[root@master basic]# vim develop-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name:develop[root@master basic]# kubectl get ns #先查看目前有得名称空间 注意这里得名字不可重复
NAME STATUS AGE
default Active 3d17h
kube-node-lease Active 3d17h
kube-public Active 3d17h
kube-system Active 3d17h[root@master basic]# kubectl create -f develop-ns.yaml #生成名称空间 表示从develop-ns.yaml文件中加载定义名称空间
namespace/develop created[root@master basic]# kubectl get ns #查看新生成得名称空间
NAME STATUS AGE
default Active 3d17h
develop Active 2m51s
kube-node-lease Active 3d17h
kube-public Active 3d17h
kube-system Active 3d17h
声明式对象配置
使用资源清单创建名称空间,namespace属于集群级别的资源
[root@master basic]# vim prod-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: prod[root@master basic]# kubectl apply -f prod-ns.yaml #表示从prod-ns.yaml文件中加载定义名称空间
namespace/prod created
声明式操作,此时如果修改了配置文件,再apply一次即可。而陈述式配置 create只能一次。
声明式操作apply还可以把目录下的所有yaml文件直接应用,因此推荐使用。它是最好的k8s api功能接口:声明式接口。
想一下,我们在定义namespace时没有使用哪个字段,那我们怎么知道一个spec中会嵌套或者依赖哪个字段,而一个资源到底应该属于哪个群组的哪个版本,可搜索kubernetes reference手册https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/ 这里查看你所对应的kubernetes版本 这个手册看一查看如何定义pod、namespace等
创建自主式pod,不被任何控制器管理的pod
[root@master basic]# kubectl get pod/ng-dep-5fb7d74687-vfssn -o yaml > /root/manifests/basic/pod-demo.yaml #先导入一个yaml得模板直接复用
[root@master basic]# vim pod-demo.yaml #修改yaml文件
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: pod-demo
namespace: develop
spec:
containers:
- image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
name: myapp #当前容器名字
resources: {} #容器期望所拥有得资源cpu、内存 这个定义得有上下线,最多不能超过多少,最少是多少
dnsPolicy: ClusterFirst #表示使用什么样得策略 ClusterFirst表示默认优先使用dns集群上得dns服务器
enableServiceLinks: true #要不要允许service来引用它
priority: 0 # 指这个pod得优先级
restartPolicy: Always #表示一旦这个pod中得容器down掉就重启 restartPolicy是重启策略
schedulerName: default-scheduler #使用哪个scheduler调度
securityContext: {} #定义安全上下文[root@master basic]# kubectl apply -f pod-demo.yaml
pod/pod-demo created[root@master basic]# kubectl get pods -n develop #查看develop名称空间得pod
NAME READY STATUS RESTARTS AGE
pod-demo 1/1 Running 0 28m
了解API对象属性的方法
在准备manifest文件时,可以参考kubernetes官网的http://kubernetes.io/docs/api参考文档,来了解API对象支持的属性,也可以使用kubectl explain命令。很多时候,使用后者更便捷
kubectl explain命令参考网址 https://blog.csdn.net/jinguangliu/article/details/88733530
定义一个pod中有多个容器:
[root@master basic]# vim pod.demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-2
namespace: prod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
- name: bbox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 3600"]
其中 command: <[]string 字符串列表>, command: ["/bin/sh","-c","sleep 3600"]也可以写成如下形式:
- /bin/sh
- -c
- “sleep 3600”
[root@master basic]# kubectl apply -f pod.demo-2.yaml
pod/pod-demo-2 created
[root@master basic]# kubectl get pods -n prod #查看创建得pod
NAME READY STATUS RESTARTS AGE
pod-demo-2 2/2 Running 0 83s需要注意READY 2/2 的数字 右侧的数字是定义了几个容器,左侧表示已经就绪了几个
验证:同一个Pod中的两个容器是共享同一个网络名称空间的
进入容器的交互式接口去访问另外一个容器
[root@master basic]# kubectl exec pod-demo-2 -c bbox -n prod -it -- /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether be:67:bf:21:23:d5 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.4/24 brd 10.244.1.255 scope global eth0
valid_lft forever preferred_lft forever
/ # wget -O - -q 127.0.0.1
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ #
如何查看pod中容器的日志:例如查看myapp的日志
[root@master basic]# kubectl logs pod-demo-2 -n prod -c myapp # kubectl logs Pod名称 -n 名称空间 -c 容器
127.0.0.1 - - [09/Nov/2020:08:38:45 +0000] "GET / HTTP/1.1" 200 65 "-" "Wget" "-"注意:如果pod中有一个容器,无需-c去指定哪个容器 例如
[root@master basic]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ng-dep-5fb7d74687-vfssn 1/1 Running 0 3d22h 10.244.2.3 node2 <none> <none>
[root@master basic]# kubectl logs ng-dep-5fb7d74687-vfssn
10.244.0.0 - - [05/Nov/2020:10:12:58 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [05/Nov/2020:10:12:58 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "http://49.232.237.242:32405/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
2020/11/05 10:12:58 [error] 6#6: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.0.0, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "49.232.237.242:32405", referrer: "http://49.232.237.242:32405/"
10.244.0.0 - - [05/Nov/2020:10:13:34 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36" "-"
2020/11/05 10:13:34 [error] 6#6: *3 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.0.0, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "49.232.237.242:32405", referrer: "http://49.232.237.242:32405/"
10.244.0.0 - - [05/Nov/2020:10:13:34 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://49.232.237.242:32405/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36" "-"
10.244.0.0 - - [05/Nov/2020:10:24:43 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-"
10.244.0.0 - - [06/Nov/2020:08:26:00 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [06/Nov/2020:08:26:01 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [06/Nov/2020:08:26:01 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [06/Nov/2020:08:26:02 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [06/Nov/2020:08:26:02 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
10.244.0.0 - - [09/Nov/2020:08:47:03 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
如何让pod共享它所在的宿主机的网络名称空间:注意这种操作是有风险的 用hostNetwork参数。弊端分配的地址为所在节点的IP地址,可在外部访问。但存在端口冲突的可能:
[root@master basic]# vim host-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
hostNetwork: true #这里表示我们要让Pod直接共享它所调度的目标主机的宿主机的名称空间,如果宿主机没有监听80端口,它就会监听宿主机的80端口[root@master basic]# kubectl apply -f host-pod.yaml
pod/mypod created[root@master basic]# kubectl get pods -o wide #可以看到这里的容器是node2宿主机的地址
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod 1/1 Running 0 57s 172.21.16.33 node2 <none> <none>
ng-dep-5fb7d74687-vfssn 1/1 Running 0 3d22h 10.244.2.3 node2 <none> <none>
ports 指定容器暴露的端口
需要注意,在k8s上每一个pod所使用的ip就是它的pod的IP.也就是说彼此之间访问是不会做地址转换的,因此无论暴露与否,这个端口就一定可以被访问,ports属性无非就是在定义一个容器的时候给它额外指定给这个端口起个名字将来在引用时可以引用。
hostport属性意思是我可以让容器所运行的宿主机节点上通过dnet的方式把宿主机一个端口与容器的一个端口建立映射关系
[root@master basic]# kubectl delete -f host-pod.yaml #删除pod
pod "mypod" deleted[root@master basic]# vim host-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- protocol: TCP
containerPort: 80
name: http
hostPort: 8080 #宿主机得8080映射到容器得80端口[root@master basic]# kubectl apply -f host-pod.yaml
pod/mypod created[root@master basic]# kubectl get pods -o wide #查看pod被调度了哪个node上
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod 1/1 Running 0 104s 10.244.2.4 node2 <none> <none>
ng-dep-5fb7d74687-vfssn 1/1 Running 0 3d23h 10.244.2.3 node2 <none> <none>
这里我们访问node2地址得8080端口就可以访问,因为我这里用得是云服务器,无法访问内网,所以我直接访问Node2得外网地址

Pod的地址是10.244.0.0/16,客户端压根不知道如何到达10.244的网络,如果想被集群外部的客户端所访问集群中的pod的服务该如何做?
- Service、NodePort
- hostPort
- hostNetwork

533

被折叠的 条评论
为什么被折叠?



