kubernetes03_命名空间pod是什么deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退(代码片段)

所得皆惊喜 所得皆惊喜     2023-02-17     243

关键词:

①. 资源创建方式

  • ①. 命令行(比如创建一个命名空间为TANG:kubectl create ns TANG)

  • ②. YAML

apiVersion: v1
kind: Namespace
metadata:
  name: TANG

②. 命名空间Namespace

  • ①. Namespace:名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络

  • ②. 关于Namespace中基本的命令
    kubectl get ns:查看命名空间
    kubectl create ns hello:创建命名空间
    kubectl delete ns hello:删除命名空间

  • ③. 使用yaml的文件创建命名空间(下面创建了hello的命名空间),hello.yaml
    如果要删除命名空间:kubectl delete -f hello.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: hello
  • ④. 使用kubectl get pods:查看的是默认(default命名空间)下的内容
[root@k8s-master~]kubectl get pods
No resources found in default namespace

③. Pod

①. Pod的概念

  • ①. 运行中的一组容器,Pod是kubernetes中应用的最小单位

②. 使用命令行的形式创建pod

  • ①. 使用命令行的形式创建pod(如kubectl run mynginx–image=nginx)

  • ②. kubectl run mynginx --image=nginx

  • ③. 查看default名称空间的Pod:kubectl get pod

  • ④. 描述:kubectl describe pod 你自己的Pod名字

  • ⑤. 删除:kubectl delete pod Pod名字

  • ⑥. 查看Pod的运行日志:kubectl logs Pod名字 h或者 kubectl logs -f Pod名字

  • ⑦. 每个Pod - k8s都会分配一个ip:kubectl get pod -owide (-o wide)

  • ⑧. 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod,部署在pod中的应用,不能通过浏览器的方式进行访问

# 我们在master节点运行
[root@k8smaster ~]# kubectl run mynginx --image=nginx
pod/mynginx created
# 这里会将创建的pod默认在default命名空间下
[root@k8smaster ~]# kubectl get pod
NAME      READY   STATUS              RESTARTS   AGE
mynginx   0/1     ContainerCreating   0          14s
[root@k8smaster ~]# kubectl describe pod mynginx

# 在node2节点可以看到运行的mynginx和nginx镜像
[root@k8snode2 ~]# docker ps |grep mynginx
8596f8e18360   nginx                                                        "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes              k8s_mynginx_mynginx_default_e3a3add5-2a0a-4af4-bcdb-719e8c1ff231_0
774584bc088f   registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/pause:3.2   "/pause"                 4 minutes ago    Up 4 minutes              k8s_POD_mynginx_default_e3a3add5-2a0a-4af4-bcdb-719e8c1ff231_0
[root@k8snode2 ~]# docker images
REPOSITORY                                                                 TAG        IMAGE ID       CREATED         SIZE
nginx                                                                      latest     ea335eea17ab   11 days ago     141MB
# 查看Pod的运行日志
kubectl logs Pod名字
# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136

[root@k8smaster ~]# kubectl get pods -owide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          21m   11.168.185.196   k8snode2   <none>           <none>
[root@k8smaster ~]# curl 11.168.185.196 
<!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@k8smaster ~]# kubectl logs -f mynginx
2021/11/28 12:54:19 [notice] 1#1: start worker process 38
2021/11/28 12:54:19 [notice] 1#1: start worker process 39
11.168.16.128 - - [28/Nov/2021:13:14:56 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
# 如何进入到mynginx容器
[root@k8smaster ~]# kubectl get pods 
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          15m
[root@k8smaster ~]# kubectl exec -it mynginx -- /bin/bash
root@mynginx:/# cd /usr/share/nginx/html/
root@mynginx:/usr/share/nginx/html# ls
50x.html  index.html
root@mynginx:/usr/share/nginx/html# echo "hello tang"->index.html
root@mynginx:/usr/share/nginx/html# 
[root@k8smaster ~]# kubectl get pod mynginx -owide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          16m   11.168.185.197   k8snode2   <none>           <none>
[root@k8smaster ~]# curl 11.168.185.197
hello tang-

③. yaml文件的形式创建pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx

④. 使用图形化界面创建pod




⑤. 多容器pod细节

  • ①. kubectl apply -f tomcatandnginx.yaml
    如果在同一个pod里面nginx要访问tomcat,只需要进入到nginx的容器内,通过localhost的方式就能进行访问
    如果在同一个pod里面tomcat要访问nginx,只需要进入到tomcat的容器内,通过localhost的方式就能进行访问
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat


  • ②. 同一个pod里面不能同时启动两个nginx或者redis等

④. Deployment多副本能力

  • ①. 控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
  1. 如果我们使用deployment去创建,那么如果我们使用delete删除后,它底层会删掉这个旧的重新启动一个新的出来,这里我们就可以体会到它的自愈能力
    如果我们使用kubectl run mynginx --image=nginx,使用delete命令删除后就真的删除了
  2. 查看deployment:kubectl get deploy
  3. 删除deployment:kubectl delete deploy 你的名字
# 清除所有Pod,比较下面两个命令有何不同效果?
kubectl run mynginx --image=nginx

kubectl create deployment mytomcat --image=tomcat:8.5.68
# 自愈能力
  • ②. 多副本命令行方式:kubectl create deployment my-dep --image=nginx --replicas=3

  • ③. 多副本可视化创建deployment


  • ④. 多副本yaml文件创建方式
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: nginx

⑤. Deployment扩缩容

  • ①. 扩容缩容的命令:kubectl scale
# 假设现在my-dep只有3个pod
kubectl scale --replicas=5 deployment/my-dep 
# 缩容(修改 replicas)
# 下面这种方式会打开一个配置文件
kubectl edit deployment my-dep

  • ②. 可以在可视化界面进行扩缩容能力

⑥. Deployment:自愈或故障转移

  • ①. 停机(停机之后自愈能力是指停机后Deploy会让这个停机的容器又尝试重启)

  • ②. 删除pod、容器宕机(现在有master、node1、node2,如果node1机器直接宕机了,经过一段时间,原来在node1上的pod会转移到node2节点上)

⑦. Deployment:滚动更新

  • ①. 滚动更新:如下图的v1想转换到v2,这个时候会尝试启动第使用v2的第一个pod,只有当v2的第一个pod起作用后,会替换掉v1的第一个pod,然后一次更新第二个v1的pod,会存在v1、v2两个版本并存的情况

  • ②. 使用命令的方式实现滚动更新
    kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record(注意这里的nginx=nginx:1.16.1第一个nginx需要通过命令 kubectl get deploy my-dep-01 -oyaml查看到)
# 实时的去监控
[root@k8smaster ~]# kubectl get pod -w
NAME                        READY   STATUS    RESTARTS   AGE
my-dep-01-686cfb7bf-8hwp8   1/1     Running   1          11h
my-dep-01-686cfb7bf-9g2ws   1/1     Running   1          11h
my-dep-01-686cfb7bf-9jz5m   1/1     Running   1          11h
my-dep-01-686cfb7bf-b54z6   1/1     Running   1          11h
my-dep-01-686cfb7bf-xhvjz   1/1     Running   1          11h
# 使用如下命令后,会出现下图的效果
[root@k8smaster ~]# kubectl get deploy my-dep-01 -0yaml

  • ③. 更新好之后,使用如下命令监控可以看到已经进行了替换
# 通过命令我们已经发生了滚动更新,将nginx:laster的版本更新到了nginx:1.16.1
[root@k8smaster ~]# kubectl get deploy my-dep-01 -oyaml |grep nginx
    kubernetes.io/change-cause: kubectl set image deployment/my-dep-01 my-dep-01=nginx:1.16.1
      - image: nginx:1.16.1

⑧. Deployment:版本回退

  • ①. 通过kubectl rollout history deployment/my-dep-01查看之前的历史,2这个版本我们将nginx改为了1.16.1的版本,然后我们使用命令进行回退,又将1.16.1的版本改为了latest
[root@k8smaster ~]# kubectl rollout history deployment/my-dep-01
deployment.apps/my-dep-01 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/my-dep-01 my-dep-01=nginx:1.16.1 --record=true
[root@k8smaster ~]# kubectl rollout undo deployment/my-dep-01 --to-revision=1
deployment.apps/my-dep-01 rolled back
[root@k8smaster ~]# kubectl get deploy my-dep-01 -oyaml |grep nginx
      - image: nginx

  • ②. 版本回退常用命令
#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

⑨. 其他工作负载

Kubernetes 中跨 pod 的跨命名空间通信

】Kubernetes中跨pod的跨命名空间通信【英文标题】:Crossnamespacecommunicationacrosspodsinkubernetes【发布时间】:2021-11-1006:08:49【问题描述】:如何在Kubernetes中跨pod进行跨命名空间通信?假设webserver&applicationpod位于命名空间A中,DB位... 查看详情

kubernetes配置pod和容器(五)应用资源配额和限制

...面的资源:Namespace,ResourceQuota,和LimitRange。你必须有一个Kubernetes集群,并且kubectl命令行工具能够和你的集群沟通。如果你还没有集群,可以使用Minikube创建一个集群。集群管理员操作多用户团队的集群,集群管理员希望可以控制... 查看详情

kubernetes对象之pod(代码片段)

系列目录Pod是Kubernetes调度的最小单元。一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统因此处于一个Pod中的多个容器共享以下资... 查看详情

只监控一个命名空间 pod - Prometheus & Kubernetes & cadvisor

】只监控一个命名空间pod-Prometheus&Kubernetes&cadvisor【英文标题】:Monitoronlyonenamespacepods-Prometheus&Kubernetes&cadvisor【发布时间】:2021-07-1509:13:10【问题描述】:我在kubernetes上部署了istio,并从istio插件安装了prometheus。我的... 查看详情

Kubernetes 用户无法在命名空间中列出“pod”

】Kubernetes用户无法在命名空间中列出“pod”【英文标题】:Kubernetesusercannotlist"pods"innamespace【发布时间】:2020-11-0611:13:28【问题描述】:我正在尝试将AWSIAM角色(联合)映射到EKSRBAC,尝试遵循this教程,但仍然出现错误➜... 查看详情

将外部 NFS 导出与 kubernetes pod 一起使用

】将外部NFS导出与kubernetespod一起使用【英文标题】:UsingexternalNFSexportswithkubernetespods【发布时间】:2019-01-0806:03:17【问题描述】:有什么方法可以配置k8s以便在某些外部nfs服务器上预定义的nfs导出仅适用于属于特定命名空间的pod... 查看详情

删除所有 kubernetes 命名空间中的所有 pod 的命令

】删除所有kubernetes命名空间中的所有pod的命令【英文标题】:Commandtodeleteallpodsinallkubernetesnamespaces【发布时间】:2016-02-0404:48:17【问题描述】:在查看文档时,有一个API调用来删除单个pod,但是有没有办法删除所有命名空间中的... 查看详情

Kubernetes 清理 pod、服务、部署等

】Kubernetes清理pod、服务、部署等【英文标题】:kubernetescleanupofpods,service,deploymentetc【发布时间】:2019-11-2215:53:21【问题描述】:为了设置kubernetes,我首先创建了命名空间、部署和服务。要清理资源,我是否需要遵循任何顺序,... 查看详情

kubernetes学习笔记-了解kubernetes机理-同节点/不同节点pod通信20220723

一、了解运行中的pod是什么当创建一个pod是运行的是docker,可以创建一个pod容器,ssh到运行的pod工作节点,查看运行的docker容器kubectlrunnginx--image=nginxdockerps运行命令后,将会看到nginx容器,以及一个附加容... 查看详情

Kubernetes 中的网络策略问题

】Kubernetes中的网络策略问题【英文标题】:Issuewithnetworkpoliciesinkubernetes【发布时间】:2020-08-2400:56:22【问题描述】:创建一个命名空间取证取证命名空间内的所有pod都不能与外界通信(出口隔离)在默认命名空间中创建一个名... 查看详情

kubernetes之pod常用操作(代码片段)

...5d23hkube-node-leaseActive5d23hkube-publicActive5d23hkube-systemActive5d23hkubernetes-dashboardActive5d20h[root@masterdemo]#kubectlgetpodNoresourcesfoundindefaultnamespace.[root@masterdemo]#2、指定命名空间查看pod如下,指定命名空间即查询kube-system命名空间的pod&... 查看详情

kubernetes学习总结(11)——kubernetespod到底是什么?(代码片段)

前言【译】WhatareKubernetesPodsAnyway?最近看到了一条关于KubernetesPods的推特,来自了不起的AmyCodes(我真的希望这是她的真名):虽然不是100%准确(容器并不是一个真正的东西。我们将在稍后讨论这个东东)不过它确实指出了一个... 查看详情

kubernetes学习总结(11)——kubernetespod到底是什么?(代码片段)

前言【译】WhatareKubernetesPodsAnyway?最近看到了一条关于KubernetesPods的推特,来自了不起的AmyCodes(我真的希望这是她的真名):虽然不是100%准确(容器并不是一个真正的东西。我们将在稍后讨论这个东东)不过它确实指出了一个... 查看详情

无法使用 opa 网守在 kubernetes 上的特定命名空间 (prod) 中拒绝具有最新标签的 pod

】无法使用opa网守在kubernetes上的特定命名空间(prod)中拒绝具有最新标签的pod【英文标题】:unabletouseopagatekeeperfordenyingpodswithlatesttagsinaspecificnamespace(prod)onkubernetes【发布时间】:2020-09-1612:13:36【问题描述】:我是OPA策略的新手,... 查看详情

kubernetes网络模型-flannel+calico

切换网络所有pod需要重建Kubernetes要求所有的网络插件实现必须满足如下要求:一个Pod一个IP所有的Pod可以与任何其他Pod直接通信,无需使用NAT映射所有节点可以与所有Pod直接通信,无需使用NAT映射Pod内部获取到的IP地址与其他Pod... 查看详情

kubernetes架构介绍(代码片段)

目录一、Kubernetes架构1、Kubernetes是什么?2、Kubernetes架构3、Master节点4、Node节点5、推荐Add-ons6、Kubeadm7、查看组件运行状态8、Kubeadm容器化组件二、namespace1、命名空间—namespace2、常用命名空间命令1.查看存在哪些namespace2.对指... 查看详情

kubernetes网络策略,允许访问特定ip

】kubernetes网络策略,允许访问特定ip【英文标题】:kubernetesnetworkpolicies,allowaccesstoaspecificip【发布时间】:2020-10-0602:20:38【问题描述】:我有以下任务要执行创建一个名为forensics的命名空间取证命名空间内的所有pod都不应与外界... 查看详情

kubernetes_cni_01_calico(代码片段)

文章目录一、概述二、Calico架构和核心组件三、什么是BGP?三、Calico两种网络模式1)IPIP模式2)BGP模式四、安装Calico插件方式1:通过helm安装Calico方式2:通过yaml文件安装方式3:k8sflannel网络切换calico步骤1&#... 查看详情