创建一个http应用程序
1)创建一个应用程序,我们使用 "kubectl run " 命令,是 “kubectl run -h” 查看命令使用帮助,命令说明告诉我们这个命令可以创建一个deployment或者job的容器(deployment和job是什么意思,我们后续再讲)
[root@master ~]# kubectl run nginx-deploy --image=nginx --port=80
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-deploy created
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-app 2/2 2 2 6m51s
nginx-deploy 1/1 1 1 8s
[root@master ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 1/1 1 1 22s nginx-deploy nginx run=nginx-deploy
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 36s 10.244.1.7 node01 <none> <none>
[root@master ~]# curl 10.244.1.7 -I
HTTP/1.1 200 OK
当我们在集群之外访问是发现无法访问,那么集群之外的客户端如何才能访问呢?这就需要我们的service服务了,下面我们就创建一个service,是外部客户端可以访问我们的pod
[root@master ~]# kubectl expose deployment nginx-deploy --name=myweb --port=80 --type=NodePort
service/myweb exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d2h
myweb NodePort 10.106.20.142 <none> 80:32438/TCP 11s
nginx-svc ClusterIP 10.99.171.202 <none> 8080/39393/TCP 107m
pod应用程序的扩容与伸缩
[root@master ~]# kubectl scale deployment nginx-deploy --replicas=2
deployment.extensions/nginx-deploy scaled
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-n7mhg 1/1 Running 0 11s 10.244.2.7 node02 <none> <none>
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 14m 10.244.1.7 node01 <none> <none>
也可以通过编写容器的yaml配置文件来进行设置
[root@master ~]# kubectl edit deployment nginx-deploy
deployment.extensions/nginx-deploy edited
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-ls5nn 1/1 Running 0 6s 10.244.1.8 node01 <none> <none>
nginx-deploy-5c9b546997-n7mhg 1/1 Running 0 91s 10.244.2.7 node02 <none> <none>
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 15m 10.244.1.7 node01 <none> <none>
服务的升级与回滚
[root@master ~]# kubectl describe deployments. nginx-deploy
Image: nginx
[root@master ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15
[root@master ~]# kubectl describe deployments. nginx-deploy
Image: nginx:1.15
应用程序服务的回滚
describe显示容器的详细信息
[root@master ~]# kubectl describe deployments nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----
升级版本
[root@master ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15
deployment.extensions/nginx-deploy image updated
[root@master ~]# kubectl describe deployments. nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:Image: nginx:1.15
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----
回滚到之前版本
[root@master ~]# kubectl rollout undo deployment nginx-deploy
deployment.extensions/nginx-deploy rolled back
[root@master ~]# kubectl describe deployments nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----
kubectl常用命令集合
kubectl run #创建一个deployment或job来管理创建的容器
kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe #显示特定资源或资源组的详细信息
kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set #更改现有的应用程序资源
kubectl rollout #资源回滚管理
创建资源的方法:资源清单
APIserver仅接受JSON格式的资源定义;
Yaml格式提供配置清单,apiserver可以无损、自动的将其转为json格式,而后再提交;
- 什么是资源清单
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单 - 资源清单的格式
apiVersion: group/apiversion #如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类别
metadata: #资源元数据
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段有kubernetes自身维护,用户不能去定义
大部分资源的配置清单都有五个一级字段组成:
apiVersion :group/version
在终端执行kubectl api-versions 查看一下可以看到这个分好组了已经,分组的好处是,如果一个组做出了改变,其他组不收影响,再者一个组加版本号以后,可以在同一个组并存。
版本号级别:
- v1:Pod是最核心资源,它属于V1,而控制器等其他属于apps/v1组
- Beta(贝塔)属于公测版本,不是公共厕所。里边大部分内容都有测试过,还有极少数内容,还需要测试,待定。还有阿尔法:(内测版本)
kind:资源类别
这个有内建的,也可以自定义,不过要按照一定的书写格式来写
metadata: 叫元数据
name,(必须是唯一的),namespace(k8s的和之前提到过的6项隔离的定义是不一样的),labels:(标签),annotations(资源注解),每个资源的引用PATH(路径)/api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME
Spec:disred state(期望的状态)
最重要,可以嵌套二级或三级字段,不同的类型资源,其spec应该是各不相同的。
Status:当前状态
本字段由kubernetes集群维护;用户不能自定义。
如何编写yaml,可先查看例子
[root@master ~]# kubectl explain pods //看到Object,就注意会嵌套跟多二级字段
[root@master ~]# kubectl explain pods.metadata //查看某个字段怎么写
String是字符串,[ ]括号是列表。Map表示是json格式的,由众多K\V组成的json格式的数组。
[root@master ~]# kubectl explain pods.spec
其中containers <[]Object> -required- 有required是比写字段。
[root@master ~]# kubectl explain pods.spec.containers //查看嵌套字段怎么写
Command(自定义)、ENV定义环境变量、ENVFROM从其他地方获取环境变量、imagePullicy(镜像获取策略)
编写一个yaml文件
[root@master ~]# mkdir /usr/local/k8s/yaml_conf/ -p
[root@master ~]# cd /usr/local/k8s/yaml_conf/
[root@master yaml_conf]# vim nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx
[root@master yaml_conf]# kubectl apply -f nginx.yaml
deployment.extensions/nginx-deployment created
部署成功。同样地,通过 kubectl get 查看 nginx-deployment 的各种资源:
[root@master yaml_conf]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 6m42s
[root@master yaml_conf]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-flq48 1/1 Running 0 6m56s 10.244.1.11 node01 <none> <none>
nginx-deployment-855b6b9dc8-wjx5m 1/1 Running 0 6m56s 10.244.2.10 node02 <none> <none>
Deployment、ReplicaSet、Pod 都已经就绪。如果要删除这些资源,执行 kubectl delete deployment nginx-deployment 或者 kubectl delete -f nginx.yml。
[root@master yaml_conf]# kubectl delete -f nginx.yaml
deployment.extensions “nginx-deployment” deleted
资源属性定义的两种方式:基于命令的方式、基于配置文件的方式
资源的属性写在配置文件中,文件格式为 YAML。
下面对这两种方式进行比较。
- 基于命令的方式:
简单直观快捷,上手快。
适合临时测试或实验。 - 基于配置文件的方式:
配置文件描述了 What,即应用最终要达到的状态。
配置文件提供了创建资源的模板,能够重复部署。
可以像管理代码一样管理部署。
适合正式的、跨环境的、规模化部署。
这种方式要求熟悉配置文件的语法,有一定难度。
后面我们都将采用配置文件的方式,大家需要尽快熟悉和掌握。
kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl create、kubectl replace、kubectl edit 和 kubectl patch。
为避免造成不必要的困扰,我们会尽量只使用 kubectl apply,此命令已经能够应对超过 90% 的场景,事半功倍。
详解 Deployment 的配置文件格式
如何读懂 Deployment YAML 文件?
既然要用 YAML 配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常类似。
还是以 nginx-deployment 为例,配置文件如下图所示:
① apiVersion 是当前配置格式的版本。
② kind 是要创建的资源类型,这里是 Deployment。
③ metadata 是该资源的元数据,name 是必需的元数据项。
④ spec 部分是该 Deployment 的规格说明。
⑤ replicas 指明副本数量,默认为 1。
⑥ template 定义 Pod 的模板,这是配置文件的重要部分。
⑦ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑧ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image是必需的。
上面的nginx.yml 是一个最简单的 Deployment 配置文件,后面我们学习 Kubernetes 各项功能时会逐步丰富这个文件。
来源:CSDN
作者:Sir@Lrh
链接:https://blog.csdn.net/qq_42596792/article/details/103486816