Kubernetes创建资源的方式一共有两种:1.使用kubectl命令工具创建资源。2.使用文件进行创建,文件的形式分两种:一种是yaml文件,用于配置管理资源。另一种Jason文件,是用于接口之间信息的传递,多用于测试。
yaml文件的语法格式:
缩进标识层级关系
不支持制表符缩进,使用空格缩进
通常开头缩进两个空格
字符后缩进一个空格,如冒号,逗号等
“—”表示YAML格式,一个文件的开始
“#”表示注释
#创建nginxwebs资源使用nginx:latest镜像,内部开放80端口,创建3个副本
kubectl run nginxwebs --image=nginx:latest --port=80 --replicas=3
#可以用kubectl descrbie查看创建的pod.
[root@master_01 dashboard]# kubectl describe deployment/nginxwebs
Name: nginxwebs
Namespace: default
CreationTimestamp: Sat, 09 May 2020 14:10:02 +0800
Labels: run=nginxwebs
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=nginxwebs
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=nginxwebs
Containers:
nginxwebs:
Image: nginx:latest
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: nginxwebs-5cd89dd4d4 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 28m deployment-controller Scaled up replica set nginxwebs-5cd89dd4d4 to 3
我们可以从上面看出这些信息很像待会用yaml创建pod资源的格式很像。
我们可以通过yaml文件查看具体的创建资源的信息。之前我也用过类似的文件docker compose去创建docker容器。
yaml文件格式是一种非常可读性非常高的语言,其参考了多种语言如,C语言、Python等。其固有格式在之前我已经介绍过了。
首先简单介绍一下yaml格式:
1.应用名称,apiVersion: apps/v1。这类apiVersion是首先要被定义的。这里就定义了apps/v1.
我们可以通过一条命令查看有哪些应用。
kubectl api-versions
[root@master_01 ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
版本,下面为测试版本
apps/v1beta1
apps/v1beta2
比较稳定的版本为:
apps/v1
2.控制器的设定
kind: Deployment
3.元信息的设定,名称和标签,创建的控制器元信息,标签和pod的标签一致。
metadata:
name: nginxwebs
labels:
app: nginx
4.创建形式设定,指定副本和选择器指明之前的标签
spec:
replicas: 3
selector:
matchLabels:
app: nginx
5.容器创建的设定,app指定之前的标签,指定容器名称、镜像版本和容器端口
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
写完这个模板之后可以用命令创建这个资源。
kubectl create -f yaml文件
我们不难发现yaml格式的文件通常比较复杂,在生产环境中我们也没有太多的时间去编写一个yaml文件。这时我们该怎么办呢?
其实我们之前用的kubectl run命令是可以生成一个yaml的文件的。
1.检查语法,如果有任何错误会立即显示出来只要在命令后面加上 --dry-run参数
kubectl run myweb --image=nginx --port=80 --replicas=3 --dry-run
[root@master_01 ~]# kubectl run myweb --image=nginx --port=80 --replicas=3 --dry-run
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/myweb created (dry run)
2.将命令转化为yaml文件。在之前的基础上加 -o yaml
kubectl run myweb --image=nginx --port=80 --replicas=3 --dry-run -o yaml
3.生成文件并导出
kubectl run myweb --image=nginx --port=80 --replicas=3 --dry-run -o yaml > /opt/nginx.yaml
#生成的文本内容
apiVersion: apps/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: myweb
name: myweb
spec:
replicas: 3
selector:
matchLabels:
run: myweb
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: myweb
spec:
containers:
- image: nginx
name: myweb
ports:
- containerPort: 80
resources: {}
status: {}
4.基于已有服务创建yaml文件,这样就可以进行服务的备份,或者复制等操作
kubectl get deployment/myweb --export -o yaml > /opt/ng.yaml
kubectl get service/nginxweb --export -o yaml > /opt/port.yaml
查看生成的yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2020-05-09T07:39:31Z
generation: 1
labels:
run: myweb
name: myweb
namespace: default
resourceVersion: "69509"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/myweb
uid: 385e93ad-91c8-11ea-80cf-000c29002046
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 2
selector:
matchLabels:
run: myweb
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: myweb
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: myweb
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
conditions:
- lastTransitionTime: 2020-05-09T07:39:57Z
lastUpdateTime: 2020-05-09T07:39:57Z
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: 2020-05-09T07:39:31Z
lastUpdateTime: 2020-05-09T07:39:57Z
message: ReplicaSet "myweb-7fd498c87" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 3
replicas: 3
updatedReplicas: 3
生成json格式的文件也是同理操作,有兴趣可以去试一试。