美文网首页
3. kubernetes应用

3. kubernetes应用

作者: epiiplus1equal0 | 来源:发表于2019-09-26 16:06 被阅读0次

3. kubernetes应用

[TOC]

本文基于马哥的docker和k8s视频总结, 在此致谢马哥.

kubectl是唯一连接kube-apiserver的工具

kubectl可以控制的对象: pod, service, replicaset, deployment, statefulet, daemonset, job, cronjob, node

查看集群相关信息

kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

kubectl cluster-info
Kubernetes master is running at https://192.168.200.200:6443
KubeDNS is running at https://192.168.200.200:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

创建pod并测试

kubectl run --help
Create and run a particular image, possibly replicated.
 Creates a deployment or job to manage the created container(s)
 # deployment和job均为控制器, pod是kubectl控制的最小单位

kubectl run nginx --image=nginx \ 
                                    --port=80 \ 
                                    --replicas=5 \ 
                                    --dry-run=true \ 
                                    --restart=Never
    # nginx 控制器名称
    # --image=nginx 默认使用latest的镜像创建pod
    # --port=80 暴露80端口
    # --replicas=5 启动5个pod
    # --dry-run=true 启用干跑模式, 不会真正启动pod
    # --restart=Never 当pod或者container丢失时, 是否再次启动一个补上, 默认会补上, Never表示不启动新的补上
    # --command -- <cmd> <arg1> ... <argN> 启动容器时不想运行镜像中默认的命令, 而使用自定义的命令
# 创建实例, 如果使用私有仓库中的镜像, 需要指明私有仓库的地址和端口
# 创建时从节点会自动拉取对应镜像并创建pod
kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 

# 查看当前系统已被创建的deployment
kubectl get deployments
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           79s
# AVAILABLE在创建之初值可能为0, 因为创建后系统会先做就绪性检查

# 查看已创建的pod, -o wide表示显示更多信息
kubectl get pods [-o wide]
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7689897d8d-7j2xz   1/1     Running   0          11m
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-7689897d8d-7j2xz 1/1 Running 0 5m24s 10.244.1.2 node2 <none> <none>
# 此时在node2查看网络, 可发现新建的pod属于cni0桥
ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.1.1  netmask 255.255.255.0  broadcast 0.0.0.0
kubectl delete pods nginx-deploy-7689897d8d-7j2xz

# 因为在创建时指定了replicas为1, 故删除后会自动重建一个新的pod, 
# 但新pod上的container对应的ip已改变
kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7689897d8d-pj5bm   1/1     Running   0          5s

创建service固定端点

kubectl expose (-f FILENAME | TYPE NAME) [--port=port]
[--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name]
[--external-ip=external-ip-of-service] [--type=type] [options]
  --name= # service name
  --port= # service port
  --type= # service type, such as ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'
    # ClusterIP 此service只有一个service ip, 只能被集群内的各pod客户端所访问
    # 特别注意大小写不可出错!!! 大小写有严格的区分!!!

# 创建service固定端点
kubectl expose deployment nginx-deploy \
                             --name=nginx \ 
                             --port=80 \ 
                             --target-port=80 \ 
                             --protocol=TCP
    # deployment nginx-deploy 将nginx-deploy控制器内的资源都创建为一个服务
    # --name=nginx 服务名为nginx

# 查看创建的service
kubectl get services
kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   6h32m
nginx        ClusterIP   10.98.70.214   <none>        80/TCP    15s
    # 现在在集群内可以使用10.98.70.214这个地址访问80端口

kubectl get pods -o wide -n kube-system
NAME                            READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES
coredns-5c98db65d4-9txgv        1/1     Running   13         6h36m   10.244.0.10       node1   <none>           <none>
coredns-5c98db65d4-fmqmt        1/1     Running   13         6h36m   10.244.0.11       node1   <none>           <none>

kubectl get svc -n kube-system
NAME     TYPE      CLUSTER-IP  EXTERNAL-IP  PORT(S)                 AGE
kube-dns ClusterIP 10.96.0.10  <none>       53/UDP,53/TCP,9153/TCP  6h39m
    # 使用10.96.0.10的kube-dns来解析刚创建的nginx服务
# 再创建一个pod作为客户端测试nginx, -it 交互终端, 类似于docker的-it选项
kubectl run client --image=busybox --replicas=1 --restart=Never -it
/ # cat /etc/resolv.conf 
nameserver 10.96.0.10 # 会发现新建的pod的DNS服务器是10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
/ # wget -O - -q http://nginx:80
    # 会被DNS自动解析到service ip及端口, 即10.98.70.214:80, 然后被调度到nginx pod

# svc.cluster.local 特殊域名后缀, 表示kubernetes集群本地pod资源
# default 所属的名称空间的名字
dig -t A nginx.default.svc.cluster.local @10.96.0.10

kubectl delete pods nginx-deploy-7689897d8d-pj5bm
    # 删除刚建立的nginx pod, 会发现client上依旧可以访问nginx service
    # 因为Selector是根据service的Label做区分
# 查看service nginx的详细信息
kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            run=nginx-deploy
Annotations:       <none>
Selector:          run=nginx-deploy # 选择器选择所有拥有run标签, 且值为nginx-deploy的pod资源
Type:              ClusterIP
IP:                10.98.70.214
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.3:80 # 可以看到关联的ip和port
Session Affinity:  None
Events:            <none>

kubectl get pods --show-labels
NAME   READY STATUS    RESTARTS AGE  LABELS
client 0/1   Completed 0        45m  run=client
nginx-deploy-7689897d8d-pj5bm 1/1 Running 0 103m pod-template-hash=7689897d8d,run=nginx-deploy # 此处的标签被Selector选中
# 可以编辑service的配置
kubectl edit svc nginx
    # 将type: ClusterIP改为type: NodePort

# 然后查看svc, 会发现多出来的端口可以用于集群外部访问
kubectl get pods
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        8h
nginx        NodePort    10.98.70.214   <none>        80:30403/TCP   109m

动态扩展

kubectl scale -h
Set a new size for a Deployment, ReplicaSet, Replication Controller, or
StatefulSet.
 Scale also allows users to specify one or more preconditions for the scale action.

# 扩展为5个pod
kubectl scale --replicas=5 deployment nginx-deploy
kubectl get pods

# 缩减为3个pod
kubectl scale --replicas=3 deployment nginx-deploy
kubectl get pods

滚动更新与回退

  • 改变镜像版本, 换成新的镜像
kubectl set image -h
# Update existing container image(s) of resources
kubectl set image (-f FILENAME | TYPE NAME) \ 
                                    CONTAINER_NAME_1=CONTAINER_IMAGE_1 \
                                    ... \ 
                                    CONTAINER_NAME_N=CONTAINER_IMAGE_N [options]

# 1. 查看CONTAINER_NAME和CONTAINER_IMAGE
kuberctl describe pods nginx-deploy-7689897d8d-pj5bm

# 2. 更新所使用的镜像版本
kubectl set image deployment nginx-deploy \ 
                                    nginx-deploy=nginx:1.14-alpine-v2

# 3. 显示更新过程
kubectl rollout status deployment nginx-deploy

# 4. 若更新出错可以回滚, 默认回退到上一个版本
kubectl rollout undo deployment nginx-deploy

相关文章

网友评论

      本文标题:3. kubernetes应用

      本文链接:https://www.haomeiwen.com/subject/hwhnuctx.html