一、kubectl进行nginx应用测试

这里使用的minikube环境进行测试,可以使用官方版,国内的话可以使用aliyun修改版(https://yq.aliyun.com/articles/221687

 1[root@ecs-255b ~]# cat nginx/deployment.yaml
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: nginx-deployment
 6spec:
 7  selector:
 8    matchLabels:
 9      app: nginx
10  replicas: 2 # tells deployment to run 2 pods matching the template
11  template:
12    metadata:
13      labels:
14        app: nginx
15    spec:
16      containers:
17      - name: nginx
18        image: nginx:1.14.2
19        ports:
20        - containerPort: 80

使用如下命令可以创建deployment容器应用

1kubectl apply  -f nginx/deployment.yaml

注:该yaml文件也可以是远程网络上的一个文件。

此时修改文件中的replicas 数量为4,再次重启apply ,并开另一个窗口,可以查看到pod的变化会逐步由2变为4

1[root@ecs-255b ~]# kubectl get deployments nginx-deployment --watch

接下来再对nginx的版本进行升级:

 1[root@ecs-255b ~]# cat nginx/deployment-update.yaml
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: nginx-deployment
 6spec:
 7  selector:
 8    matchLabels:
 9      app: nginx
10  replicas: 2
11  template:
12    metadata:
13      labels:
14        app: nginx
15    spec:
16      containers:
17      - name: nginx
18        image: nginx:1.16.1 # Update the version of nginx from 1.14.2 to 1.16.1
19        ports:
20        - containerPort: 80

再次使用kubectl apply应用后,可以通过如下命令查看其版本信息,会发现其版本已经由之前的版本升级成新的版本。

1[root@ecs-255b ~]# kubectl describe deployments nginx-deployment 

二、完整示例

在概念篇里我们有学到k8s有namespace label deployment service pod,这里从namespace开始做一个完整的实验。

1、Namespace在很多情况下用于实现多用户的资源隔离,通过将集群内部的资源对象分配到不同的Namespace中,形成逻辑上的分组,便于不同的分组在共享使用整个集群的资源同时还能被分别管理。

 1//通过命令创建
 2[root@ecs-255b ~]# kubectl create namespace test
 3namespace/test created
 4//通过yaml文件创建
 5[root@ecs-255b ~]# cat test.yaml  //创建创建文件
 6apiVersion: v1
 7kind: Namespace
 8metadata:
 9  name: test
10[root@ecs-255b ~]# kubectl create -f test.yaml
11[root@ecs-255b ~]# kubectl get ns  //查看namespace
12[root@ecs-255b ~]# kubectl replace --force -f test.yaml   //重建
13namespace test deleted
14namespace/test replaced
15[root@ecs-255b ~]# kubectl delete namespaces test //删除
16namespace test deleted   

2、Label是Kubernetes系统中另一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定。在k8s基本概念篇中我们也总结过,label可以设置ns、Node、Pod、Service、RC等。

 1//设置label
 2[root@ecs-255b ~]# kubectl label namespaces test colour=green
 3namespace/test labeled
 4[root@ecs-255b ~]# kubectl get namespaces test --show-labels
 5NAME   STATUS   AGE     LABELS
 6test   Active   9m48s   colour=green,kubernetes.io/metadata.name=test
 7//修改label
 8[root@ecs-255b ~]# kubectl label namespaces test colour=red --overwrite
 9namespace/test labeled
10[root@ecs-255b ~]# kubectl get namespaces test --show-labels
11NAME   STATUS   AGE   LABELS
12test   Active   10m   colour=red,kubernetes.io/metadata.name=test
13//删除label
14[root@ecs-255b ~]# kubectl label namespaces test colour-
15namespace/test labeled

3、Deployment是Kubenetes v1.2引入的新概念,引入的目的是为了更好的解决Pod的编排问题,Deployment内部使用了Replica Set来实现。Deployment的定义与ReplicaSet的定义很类似,除了API声明与Kind类型有所区别。deployment的定义类似如下:

 1## Deployment
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: mysql
 6  labels:
 7    app: mysql
 8spec:
 9  replicas: 1
10  selector:
11    matchLabels:
12      app: mysql
13  template:
14    metadata:
15      labels:
16        app: mysql
17    spec:
18      containers:
19      - name: mysql
20        image: mysql:8.0.19
21        ports:
22        - containerPort: 3306
23        env:
24        - name: MYSQL_ROOT_PASSWORD    ## 配置Root用户默认密码
25          value: 123456
26        resources:
27          limits:
28            cpu: 2000m
29            memory: 512Mi
30          requests:
31            cpu: 2000m
32            memory: 512Mi

应用指令如下:

 1[root@361way ~]# kubectl create -f mysql.yaml //创建deployment
 2deployment.apps/mysql-deployment created
 3[root@361way ~]# kubectl delete deployment mysql-deployment -n elk //删除
 4deployment.apps mysql-deployment deleted
 5[root@361way ~]# kubectl replace --force -f mysql.yaml //重建
 6deployment.apps mysql-deployment deleted
 7deployment.apps/mysql-deployment replaced
 8[root@361way ~]# kubectl get deployment -n elk //查看
 9NAME   READY   UP-TO-DATE   AVAILABLE   AGE
10elk    1/1     1            1           21h
11[root@361way ~]# kubectl get deployments --all-namespaces //查看所有
12NAMESPACE              NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
13default                nginx                       1/1     1            1           10d
14mysql                  mysql                       1/1     1            1           21h
15kube-system            coredns                     2/2     2            2           11d

4、Service是Kubernetes最核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。

 1[root@361way ~]# kubectl create -f mysql-service.yaml  //创建
 2service/mysql created
 3[root@361way ~]# kubectl replace --force -f mysql-service.yaml  //重建
 4service/mysql  replaced
 5[root@361way ~]# kubectl get svc -n elk  //查看
 6NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
 7nginx          ClusterIP   10.1.40.47             80/TCP           21h
 8mysql          NodePort    10.1.7.179             3306:3306/TCP    21h
 9[root@361way ~]# kubectl delete svc mysql-service -n mysql  //删除
10service mysql-service deleted 

5、Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为”根容器“的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。

 1# kubectl create -f ./pod.json   //通过pod.json文件创建一个pod。
 2# kubectl delete -f ./pod.json   //使用 pod.json中指定的资源类型和名称删除pod。
 3# kubectl delete pod,service test  //删除名为test的Pod和Service。
 4# kubectl delete pods,svc -l name=tank  //删除 Label name=tank的pod和Service。
 5# kubectl delete pod foo --grace-period=0 --force  //强制删除dead node上的pod
 6# kubectl delete pods --all  //删除所有pod
 7//通过设置replicas来删除pod
 8[root@361way mysql]# kubectl scale --replicas=0 -f mysql-rc.yaml
 9replicationcontroller/mysql scaled
10[root@361way mysql]# kubectl get pod
11NAME                    READY   STATUS        RESTARTS   AGE
12mysql-cd7tm             1/1     Terminating   0          57s
13nginx-f89759699-545w5   1/1     Running       0          10d
14[root@361way mysql]# kubectl get pod
15NAME                    READY   STATUS    RESTARTS   AGE
16nginx-f89759699-545w5   1/1     Running   0          10d
17# kubectl replace -f ./pod.json    //通过pod.json文件重建pod
18# kubectl replace --force -f ./pod.json   //通过pod.json文件强制重建
19//查看所有pod,svc
20[root@361way ~]#  kubectl get pod,svc --all-namespaces
21NAMESPACE              NAME                                             READY   STATUS    RESTARTS   AGE
22default                pod/nginx-f89759699-545w5                        1/1     Running   0          11d
23mysql                  pod/mysql-ddc4c865b-859ks                        1/1     Running   0          22h
24kube-system            pod/coredns-7ff77c879f-bxgtr                     1/1     Running   2          11d
25……
26NAMESPACE              NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
27default                service/kubernetes                  ClusterIP   10.1.0.1              443/TCP            11d
28default                service/nginx                       ClusterIP   10.1.40.47            80/TCP             21h
29mysql                  service/mysql                       NodePort    10.1.7.179            3306:3306/TCP      22h
30……