kubernetes基本概念

  • Pod:k8s最小部署单元,一组容器的集合
  • Deployment:最常见的控制器,用于更高级别部署和管理Pod
  • Service:为一组Pod提供负载均衡,对外提供统一访问入口
  • Label:标签,附加到某个资源上,用于关联对象、查询和筛选
  • Namespaces:命名空间。将对象逻辑上隔离,也利于权限控制

kubectl管理命令

类型

命令

描述

基础命令

create expose run expose set explain get edit delete

通过文件名或标准输入创建资源; 为Deployment,Pod创建Service; 在集群中运行一个特定的镜像; 在对象上设置特定的功能; 文档参考资料; 显示一个或多个资源; 使用系统编辑器编辑一个资源; 通过文件名,标准输入,资源名称或标签选择器来删除资源

部署命令

rollout rolling-update scale autoscale

管理Deployment,Daemonset资源的发布(例如状态、发布记录、回滚等); 滚动升级,仅限ReplicationController; 对Deployment、ReplicaSet、RC或Job资源扩容或缩容Pod数量; 为Deploy,RS,RC配置自动伸缩规则(依赖metrics-server和hpa)

集群管理命令

certificate cluster-info top cordon uncordon drain taint

修改证书资源; 显示集群信息; 查看资源利用率(依赖metrics-server); 标记节点不可调度; 标记节点可调度; 驱逐节点上的应用,准备下线维护; 修改节点taint标记

kubectl帮助

kubectl命令官方文档 用kubectl help可以查看kubectl相关的命令

[root@master ~]# kubectl --help
kubectl controls the Kubernetes cluster manager.
 
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
 
Basic Commands (Beginner):
  create         Create a resource from a file or from stdin.
  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个新的Kubernetes Service
  run            在集群中运行一个指定的镜像
  set            为 objects 设置一个指定的特征
 
Basic Commands (Intermediate):
  explain        查看资源的文档
  get            显示一个或更多 resources
  edit           在服务器上编辑一个资源
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
 
Deploy Commands:
  rollout        Manage the rollout of a resource
  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
 
Cluster Management Commands:
  certificate    修改 certificate 资源.
  cluster-info   显示集群信息
  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         标记 node 为 unschedulable
  uncordon       标记 node 为 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一个或者多个 node 上的 taints
 
Troubleshooting and Debugging Commands:
  describe       显示一个指定 resource 或者 group 的 resources 详情
  logs           输出容器在 pod 中的日志
  attach         Attach 到一个运行中的 container
  exec           在一个 container 中执行一个命令
  port-forward   Forward one or more local ports to a pod
  proxy          运行一个 proxy 到 Kubernetes API server
  cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth           Inspect authorization
 
Advanced Commands:
  diff           Diff live version against would-be applied version
  apply          通过文件名或标准输入流(stdin)对资源进行配置
  patch          使用 strategic merge patch 更新一个资源的 field(s)
  replace        通过 filename 或者 stdin替换一个资源
  wait           Experimental: Wait for a specific condition on one or many resources.
  convert        在不同的 API versions 转换配置文件
 
Settings Commands:
  label          更新在这个资源上的 labels
  annotate       更新一个资源的注解
  completion     Output shell completion code for the specified shell (bash or zsh)
 
Other Commands:
  alpha         Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Provides utilities for interacting with plugins.
  version        输出 client 和 server 的版本信息

Kubectl常用命令的使用

explain

获取资源

用法:
kubectl explain RESOURCE

//获取资源及其字段的文档
、[root@master ~]# kubectl explain pods
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata     <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec <Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   status       <Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

edit

编辑资源

//运行一个pod类型的nginx,名字叫nginx,内型是deployment
[root@master ~]# kubectl create deployment nginx --image nginx 
deployment.apps/nginx created
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-7wp8w   1/1     Running   0          24s
[root@master ~]# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           28s



//使用edit命令编辑
[root@master ~]# kubectl edit deployment nginx
......
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-12-20T10:33:49Z"
  generation: 1
  labels:
    app: test   #修改为test
    name: jj	#添加name: jj
.....

//查看
[root@master ~]# kubectl describe deploy nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Tue, 21 Dec 2021 01:18:37 +0800
Labels:                 app=test   #可添加或修改
                        name=jj
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-6799fc88d8 (1/1 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m51s  deployment-controller  Scaled up replica set nginx-6799fc88d8 to 1

scale

动态扩展

//使用scale扩展
[root@master ~]# kubectl scale deployment/nginx --replicas 3
deployment.apps/nginx scaled
//扩展后查看多了几个相同类型的pod
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-7wp8w   1/1     Running   0          3m56s
nginx-6799fc88d8-jxq2b   1/1     Running   0          18s
nginx-6799fc88d8-mk2tl   1/1     Running   0          18s

[root@master ~]# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           4m3s


//如果只需要2个deployment类型的nginx的pod
[root@master ~]# kubectl scale deployment/nginx --replicas 2
deployment.apps/nginx scaled

[root@master ~]# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           4m24s

//查看发现只有两个(删除是随机的)
[root@master ~]# kubectl get pod
NAME                     READY   STATUS        RESTARTS   AGE
nginx-6799fc88d8-7wp8w   1/1     Running       0          4m27s
nginx-6799fc88d8-mk2tl   1/1     Running       0          49s

autoscale

自动扩展,给定一个范围,自动根据业务的访问量增加或减少

//最少3个,当不满足条件时会自动创建
[root@master ~]# kubectl autoscale deployment/nginx --min 3 --max=5
horizontalpodautoscaler.autoscaling/nginx autoscaled
[root@master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-27zww   0/1     ContainerCreating   0          0s
nginx-6799fc88d8-7wp8w   1/1     Running             0          5m28s
nginx-6799fc88d8-mk2tl   1/1     Running             0          110s

//当大于5个时,先创建,之后也会随机删除,直到满足条件五个
[root@master ~]# kubectl scale deployment/nginx --replicas 7
deployment.apps/nginx scaled
[root@master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-27zww   1/1     Running             0          40s
nginx-6799fc88d8-7wp8w   1/1     Running             0          6m8s
nginx-6799fc88d8-dkvsg   0/1     ContainerCreating   0          4s
nginx-6799fc88d8-hzvlm   0/1     ContainerCreating   0          4s
nginx-6799fc88d8-jk56n   0/1     ContainerCreating   0          4s
nginx-6799fc88d8-mk2tl   1/1     Running             0          2m30s
[root@master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-27zww   1/1     Running             0          47s
nginx-6799fc88d8-7wp8w   1/1     Running             0          6m15s
nginx-6799fc88d8-dkvsg   0/1     Terminating         0          11s
nginx-6799fc88d8-hzvlm   1/1     Running             0          11s
nginx-6799fc88d8-jk56n   0/1     ContainerCreating   0          11s
nginx-6799fc88d8-mk2tl   1/1     Running             0          2m37s

cluster-info

显示集群信息

[root@master ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.47.115:6443
KubeDNS is running at https://192.168.47.115:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

cordon

可调度

[root@master ~]# kubectl cordon node2
node/node2 already cordoned
[root@master ~]# kubectl cordon node2
node/node2 cordoned
[root@master ~]# kubectl get node
NAME     STATUS                     ROLES                  AGE     VERSION
master   Ready                      control-plane,master   2d23h   v1.20.0
node1    Ready                      <none>                 2d23h   v1.20.0
node2    Ready,SchedulingDisabled   <none>                 2d23h   v1.20.0

[root@master ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-27zww   1/1     Running   0          2m6s    10.244.1.21   node1   <none>           <none>
nginx-6799fc88d8-7wp8w   1/1     Running   0          7m34s   10.244.1.19   node1   <none>           <none>
nginx-6799fc88d8-hzvlm   1/1     Running   0          90s     10.244.1.22   node1   <none>           <none>
nginx-6799fc88d8-jk56n   1/1     Running   0          90s     10.244.2.13   node2   <none>           <none>
nginx-6799fc88d8-mk2tl   1/1     Running   0          3m56s   10.244.2.11   node2   <none>           <none>

[root@master ~]# kubectl scale deployment/nginx --replicas 2
[root@master ~]# kubectl get pod -o wide
NAME                     READY   STATUS        RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-27zww   0/1     Terminating   0          2m27s   10.244.1.21   node1   <none>           <none>
nginx-6799fc88d8-7wp8w   0/1     Terminating   0          7m55s   10.244.1.19   node1   <none>           <none>
nginx-6799fc88d8-hzvlm   0/1     Terminating   0          111s    10.244.1.22   node1   <none>           <none>
nginx-6799fc88d8-jk56n   1/1     Running       0          111s    10.244.2.13   node2   <none>           <none>
nginx-6799fc88d8-mk2tl   1/1     Running       0          4m17s   10.244.2.11   node2   <none>           <none>

uncordon

不可调度

[root@master ~]# kubectl uncordon node2
node/node2 uncordoned
[root@master ~]# kubectl get node
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   2d23h   v1.20.0
node1    Ready    <none>                 2d23h   v1.20.0
node2    Ready    <none>                 2d23h   v1.20.0

[root@master ~]# kubectl create deployment nginx2  --image nginx
deployment.apps/nginx2 created

[root@master ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-jk56n    1/1     Running   0          3m56s   10.244.2.13   node2   <none>           <none>
nginx-6799fc88d8-kp8vf    1/1     Running   0          2m      10.244.1.23   node1   <none>           <none>
nginx-6799fc88d8-mk2tl    1/1     Running   0          6m22s   10.244.2.11   node2   <none>           <none>
nginx2-5fc4444698-f22tb   1/1     Running   0          32s     10.244.1.24   node1   <none>           <none>

describe

显示指定pod的详细信息

[root@master ~]# kubectl describe pod nginx
Name:         nginx-6799fc88d8-jk56n
Namespace:    default
Priority:     0
Node:         node2/192.168.47.121
Start Time:   Tue, 21 Dec 2021 01:24:41 +0800
Labels:       app=nginx
              pod-template-hash=6799fc88d8
Annotations:  <none>
Status:       Running
IP:           10.244.2.13
IPs:
  IP:           10.244.2.13
Controlled By:  ReplicaSet/nginx-6799fc88d8
Containers:
  nginx:
    Container ID:   docker://4b7f630e06232bdfa7c862f3937a6e1256ae3c023644c28c6089961ac9b6c738
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 21 Dec 2021 01:25:13 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mrc8p (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-mrc8p:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mrc8p
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  4m46s  default-scheduler  Successfully assigned default/nginx-6799fc88d8-jk56n to node2
  Normal  Pulling    4m46s  kubelet            Pulling image "nginx"
  Normal  Pulled     4m15s  kubelet            Successfully pulled image "nginx" in 31.002882533s
  Normal  Created    4m15s  kubelet            Created container nginx
  Normal  Started    4m15s  kubelet            Started container nginx
·····

logs

查看日志

[root@master ~]# kubectl logs deployment/nginx
Found 3 pods, using pod/nginx-6799fc88d8-mk2tl
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/12/20 17:22:17 [notice] 1#1: using the "epoll" event method
2021/12/20 17:22:17 [notice] 1#1: nginx/1.21.4
2021/12/20 17:22:17 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2021/12/20 17:22:17 [notice] 1#1: OS: Linux 4.18.0-193.el8.x86_64
2021/12/20 17:22:17 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/20 17:22:17 [notice] 1#1: start worker processes
2021/12/20 17:22:17 [notice] 1#1: start worker process 32
2021/12/20 17:22:17 [notice] 1#1: start worker process 33


[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    2d4h
nginx        ClusterIP   10.102.213.63   <none>        8080/TCP   24h
[root@master ~]# curl 10.102.213.63:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

[root@master ~]#  kubectl logs deployment/nginx
......
2021/12/20 12:44:49 [notice] 1#1: start worker processes
2021/12/20 12:44:49 [notice] 1#1: start worker process 31
2021/12/20 12:44:49 [notice] 1#1: start worker process 32
10.244.0.0 - - [20/Dec/2021:13:04:14 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"
10.244.0.0 - - [20/Dec/2021:13:05:26 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"

attach

附加在一个容器里

[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-cpbg4   1/1     Running   0          43m
nginx-6799fc88d8-plvhf   1/1     Running   0          6m38s
nginx-6799fc88d8-rf74m   1/1     Running   0          8m57s
[root@master ~]# kubectl attach nginx-6799fc88d8-jk56n
Defaulting container name to nginx.
Use 'kubectl describe pod/nginx-6799fc88d8-jk56n -n default' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.



[root@master ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-jk56n    1/1     Running   0          7m49s   10.244.2.13   node2   <none>           <none>
nginx-6799fc88d8-kp8vf    1/1     Running   0          5m53s   10.244.1.23   node1   <none>           <none>
nginx-6799fc88d8-mk2tl    1/1     Running   0          10m     10.244.2.11   node2   <none>           <none>
nginx2-5fc4444698-f22tb   1/1     Running   0          4m25s   10.244.1.24   node1   <none>           <none>


[root@master ~]# curl http://10.244.2.13
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#新增访问日志信息,<ctrl>+c退出,容器不会终止
[root@master ~]# kubectl attach nginx-6799fc88d8-jk56n
Defaulting container name to nginx.
Use 'kubectl describe pod/nginx-6799fc88d8-jk56n -n default' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.
10.244.0.0 - - [20/Dec/2021:17:32:58 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"
^C
[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-jk56n    1/1     Running   0          8m59s
nginx-6799fc88d8-kp8vf    1/1     Running   0          7m3s
nginx-6799fc88d8-mk2tl    1/1     Running   0          11m
nginx2-5fc4444698-f22tb   1/1     Running   0          5m35s

exec

执行容器命令

[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-jk56n    1/1     Running   0          10m

[root@master ~]# kubectl exec nginx-6799fc88d8-jk56n -- date
Mon Dec 20 17:35:29 UTC 2021


[root@master ~]# kubectl exec -it nginx-6799fc88d8-jk56n -- /bin/sh
# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
# exit
[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-jk56n    1/1     Running   0          11m

prot-forward

转发一个或多个端口到pod里面去

[root@master ~]# kubectl get deployment
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
nginx2   1/1     1            1           11m

[root@master ~]# kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
nginx2-5fc4444698-f22tb   1/1     Running   0          11m

[root@master ~]# kubectl port-forward deployment/nginx2 80
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
#可以变成':80'(随机一个端口号,只能本机访问)或者变成指定的端口号'8080:80'(本机访问用80,其它主机访问就可以用8080)
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80

[root@master ~]# ss -anlt
State          Recv-Q          Send-Q                     Local Address:Port                    Peer Address:Port         
......                        0.0.0.0:*            
LISTEN         0               128                            127.0.0.1:2381                         0.0.0.0:*            
LISTEN         0               128                            127.0.0.1:80                           0.0.0.0:*            

[root@master ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


[root@master ~]# kubectl port-forward --address 0.0.0.0 deployment/nginx2 80
Forwarding from 0.0.0.0:80 -> 80


//允许所有IP访问80端口
[root@master ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

kubectl edit修改仓库地址 kubectl replace_运维

cp

复制
拷贝文件或目录到容器中,或者从容器内向外拷贝

[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
nginx2-5fc4444698-f22tb   1/1     Running   0          14m

[root@master ~]# ls
anaconda-ks.cfg  init

[root@master ~]# kubectl cp /root/init nginx2-5fc4444698-f22tb:/tmp
[root@master ~]# kubectl exec nginx2-5fc4444698-f22tb -- ls -l /tmp
total 4
-rw-r--r-- 1 root root 174 Dec 20 17:43 init

label

标签
给资源设置、更新标签

[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
nginx2-5fc4444698-f22tb   1/1     Running   0          17m

[root@master ~]# kubectl describe pod nginx2
Name:         nginx2-5fc4444698-f22tb
Namespace:    default
Priority:     0
Node:         node1/192.168.47.120
Start Time:   Tue, 21 Dec 2021 01:28:05 +0800
Labels:       app=nginx2
              pod-template-hash=5fc4444698
.....

//追加标签
[root@master ~]#  kubectl label pods nginx2-5fc4444698-f22tb name=test
pod/nginx2-5fc4444698-f22tb labeled
[root@master ~]# kubectl describe pod nginx2-5fc4444698-f22tb
Name:         nginx2-5fc4444698-f22tb
Namespace:    default
Priority:     0
Node:         node1/192.168.47.120
Start Time:   Tue, 21 Dec 2021 01:28:05 +0800
Labels:       app=nginx2
              name=test
              pod-template-hash=5fc4444698
Annotations:  <none>



//更改标签
[root@master ~]# kubectl label --overwrite pods nginx2-5fc4444698-f22tb app=test
pod/nginx labeled

//查看是否更改成功
[root@master ~]# kubectl describe pod nginx2-5fc4444698-f22tb
Name:         nginx2-5fc4444698-f22tb
Namespace:    default
Priority:     0
Node:         node1/192.168.47.120
Start Time:   Tue, 21 Dec 2021 01:28:05 +0800
Labels:       app=test
              name=test
              pod-template-hash=5fc4444698

api-resources

查看所有资源

[root@master ~]# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
......

api-versions

API版本

[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
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/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

version

查看版本

[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

使用deployment控制器部署镜像

[root@master ~]# kubectl create deployment nginx --image lizhenliang/java-demo
deployment.apps/nginx created
[root@master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-5fd5cdd7d4-4sjb7   1/1     Running       0          3m30s
nginx-5fd5cdd7d4-nq9bb   1/1     Running       0          3m30s
nginx-5fd5cdd7d4-p97tp   1/1     Running       0          3m45s

[root@master ~]# kubectl get deploy,pods
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/3     3            1           38s

NAME                         READY   STATUS              RESTARTS   AGE
pod/nginx-5fd5cdd7d4-4sjb7   1/1     Running       0          3m59s
pod/nginx-5fd5cdd7d4-nq9bb   1/1     Running       0          3m59s
pod/nginx-5fd5cdd7d4-p97tp   1/1     Running       0          4m14s

//使用Service将pod暴露出去
[root@master ~]# kubectl expose deployment nginx --port=80 --target-port=8080 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        2d6h
nginx        NodePort    10.111.209.122   <none>        80:32603/TCP   8s

//访问
[root@master ~]# curl 192.168.129.250:32603
<!DOCTYPE html>
<html>
<head lang="en">
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>把美女带回家应用案例</title>
        <meta name="description" content="把美女带回家应用案例">
        <meta name="keywords" content="index">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta http-equiv="Cache-Control" content="no-siteapp" />
        <link rel="stylesheet" href="../js/layui/css/layui.css" media="all">
        <link rel="stylesheet" href="../css/reset.css">
    <link rel="stylesheet" href="../css/supersized.css">
    <link rel="stylesheet" href="../css/style.css">
    <link rel="stylesheet" href="../css/typeit.css">
    <link rel="stylesheet" href="../css/date.css">
</head>
<body>
<!-- <img src="../images/logo.png"> -->
<div class="page-container">
            <h1 class="title"></h1>
            <div style="margin-top: 15%;">
                <button class="layui-btn layui-btn-lg layui-btn-primary layui-btn-radius" onclick="adduser()">添加美女</button>
                <button class="layui-btn layui-btn-lg layui-btn-primary layui-btn-radius" onclick="queryuserList()">今晚翻盘哪个</button>
            </div>
         <!--    <div style="text-align:center;clear:both" class="date">
                        </div> -->
                        <!-- <div class="connect">
                <p>联系作者:子彬</p>
                <p>
                    <a class="qq" target="_blank" href="http://wpa.qq.com/msgrd?Menu=no&Exe=QQ&Uin=125720240"></a>
                    <a class="twitter" href=""></a>
                </p>
            </div> -->
        </div>
        <script src="../js/jquery-1.8.2.min.js"></script>
        <script src="../js/layui/layui.js"></script>
        <script src="../js/supersized.3.2.7.min.js"></script>
        <script src="../js/supersized-init.js"></script>
        <script src="../js/typeit.js"></script>
        <script src="../js/date.js"></script>
        <script src="../js/index.js"></script>
        <script type="text/javascript">
                 $('.title').typeIt({
                  whatToType: "这里有很多美女,挑一个回家吧!",
              typeSpeed: 300,
              lifeLike: true,
              breakLines :true
                }, function() {
                          console.log('This is tomcat callback function!');
                });
         </script>
</body>
</html>

滚动更新、回滚

用Dockerfile编写两个镜像

[root@master ~]# mkdir httpd
[root@master ~]# cd httpd/
//制作第一版镜像
[root@master httpd]# vim Dockerfile
[root@master httpd]# cat Dockerfile 
FROM busybox

RUN mkdir  /data && \
    echo "test page on v1" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]

[root@master httpd]# docker build -t jiejiehao/httpd:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> ffe9d497c324
Step 2/3 : RUN mkdir  /data &&     echo "test page on v1" > /data/index.html
 ---> Running in 0753a276c632
Removing intermediate container 0753a276c632
 ---> 75825bd6a4d5
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
 ---> Running in af4ecc493da0
Removing intermediate container af4ecc493da0
 ---> 477d3c5c8fe7
Successfully built 477d3c5c8fe7
Successfully tagged jiejiehao/httpd:v1


//制作第二版镜像
[root@master httpd]# vim Dockerfile 
[root@master httpd]# cat Dockerfile 
FROM busybox

RUN mkdir  /data && \
    echo "test page on v2" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]


[root@master httpd]# docker build -t jiejiehao/httpd:v2 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> ffe9d497c324
Step 2/3 : RUN mkdir  /data &&     echo "test page on v2" > /data/index.html
 ---> Running in c6a32c0067e4
Removing intermediate container c6a32c0067e4
 ---> 6d1103c3febc
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
 ---> Running in e24dd849a599
Removing intermediate container e24dd849a599
 ---> 7236b2280632
Successfully built 7236b2280632
Successfully tagged jiejiehao/httpd:v2

    
[root@master httpd]# docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED          SIZE
jiejiehao/httpd                                                   v1         477d3c5c8fe7   39 seconds ago   1.24MB
jiejiehao/httpd                                                   v2         7236b2280632   54 seconds ago   1.24MB
busybox                                                           latest     ffe9d497c324   12 days ago      1.24MB
[root@master ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jiejiehao
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@master ~]# docker push jiejiehao/httpd:v1
The push refers to repository [docker.io/jiejiehao/httpd]
222718935aad: Pushed 
64cac9eaf0da: Mounted from library/busybox 
v1: digest: sha256:1ae146ca01daf76043ccad9cb5ece9eaede66ceaa2fdf9c1afdb29fcaa95ba7c size: 734
[root@master ~]# docker push jiejiehao/httpd:v2
The push refers to repository [docker.io/jiejiehao/httpd]
d59d343cf27e: Layer already exists 
64cac9eaf0da: Layer already exists 
v2: digest: sha256:ccb39d6e8db89e89efff912164ed1c309c98ea363b75c54c74afbfbd1530eb60 size: 734

滚动更新、回滚

//用k8s基于httpd:v1镜像运行镜像3个pod
[root@master httpd]# kubectl create deploy httpd --image jiejiehao/httpd:v1 --replicas 3
deployment.apps/httpd created

[root@master ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
httpd-7649d9b878-5lvf7    1/1     Running   0          8m4s
httpd-7649d9b878-ck6cq    1/1     Running   0          8m4s
httpd-7649d9b878-pkqkk    1/1     Running   0          8m4s


#暴露端口号
[root@master ~]# kubectl expose deploy httpd --port 80 --type NodePort
service/httpd exposed

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
httpd        NodePort    10.103.50.196   <none>        80:30263/TCP   37s

#访问
[root@master ~]# curl 10.103.50.196
test page on v1

[root@master ~]# curl 192.168.47.115:30263
test page on v1



//更新
[root@master ~]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v2
deployment.apps/httpd image updated

//创建一个新pod,删除一个旧pod。直到更新完成
[root@master ~]# kubectl get pod
NAME                      READY   STATUS              RESTARTS   AGE
httpd-7649d9b878-5lvf7    1/1     Terminating         0          11m
httpd-7649d9b878-ck6cq    1/1     Running             0          11m
httpd-7649d9b878-pkqkk    1/1     Terminating         0          11m
httpd-cb9c79f99-gfk9z     0/1     ContainerCreating   0          10s
httpd-cb9c79f99-w722f     1/1     Running             0          11s
httpd-cb9c79f99-zcsw5     1/1     Running             0          35s


[root@master ~]# kubectl get pod
NAME                      READY   STATUS        RESTARTS   AGE
httpd-cb9c79f99-gfk9z     1/1     Running       0          101s
httpd-cb9c79f99-w722f     1/1     Running       0          102s
httpd-cb9c79f99-zcsw5     1/1     Running       0          2m6s


#访问
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
httpd        NodePort    10.103.50.196   <none>        80:30263/TCP   5m13s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3d
[root@master ~]# curl 10.103.50.196
test page on v2
[root@master ~]# curl 192.168.47.115:30263
test page on v2





//回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back

[root@master ~]# kubectl get pod
NAME                      READY   STATUS        RESTARTS   AGE
httpd-7649d9b878-96cnm    1/1     Running       0          8s
httpd-7649d9b878-mq6mh    1/1     Running       0          6s
httpd-7649d9b878-rtmjt    1/1     Running       0          10s
httpd-cb9c79f99-gfk9z     1/1     Terminating   0          3m21s
httpd-cb9c79f99-w722f     1/1     Terminating   0          3m22s
httpd-cb9c79f99-zcsw5     1/1     Terminating   0          3m46s


[root@master ~]# curl 10.103.50.196
test page on v1
[root@master ~]# curl 192.168.47.115:30263
test page on v1


//创建v3版本
[root@master httpd]# vim Dockerfile 
[root@master httpd]# cat Dockerfile 
FROM busybox

RUN mkdir  /data && \
    echo "test page on v3" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
[root@master httpd]# docker build -t jiejiehao/httpd:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> ffe9d497c324
Step 2/3 : RUN mkdir  /data &&     echo "test page on v3" > /data/index.html
 ---> Running in 8ea936e6629c
Removing intermediate container 8ea936e6629c
 ---> a827c5b321f9
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
 ---> Running in 216b3ba59275
Removing intermediate container 216b3ba59275
 ---> 9777e0dbeee8
Successfully built 9777e0dbeee8
Successfully tagged jiejiehao/httpd:v3
[root@master httpd]# docker push jiejiehao/httpd:v3
The push refers to repository [docker.io/jiejiehao/httpd]
c05cffd8f41f: Pushed 
64cac9eaf0da: Layer already exists 
v3: digest: sha256:c27534074bae54cbf36e91e1161cc009465e4cc57b2ebf90a9edef2524bf6f12 size: 734
[root@master httpd]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v3
deployment.apps/httpd image updated

//现在属于v1,上一版本是v2
[root@master ~]# curl 10.103.50.196
test page on v1
//更新版本至v3
[root@master httpd]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v3
deployment.apps/httpd image updated
[root@master httpd]# curl 10.103.50.196
test page on v3
//回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back
//回到v1
[root@master ~]# curl 10.103.50.196
test page on v1
//再次回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back
//发现回到了v3,并没有回到v2
//说明回滚到之前的版本也算一次版本记录,所以最多只能回滚一次
[root@master ~]# curl 10.103.50.196
test page on v3