k8s pod分类、核心组件、网络模型,牧原网络面试分享经验

    • kubeconfig配置文件
  • kubectl管理命令

  • kubectl帮助

  • kubectl命令使用

    • create命令
  • get命令

  • expose命令

  • delete命令

  • run命令

K8s基本概念

======================================================================

pod分类


自主式pod

  • 自我管理的pod,创建以后仍然需要提交给apiserver,由apiserver接收以后借助于调度器将其调度至指定的node节点,由node启动此pod

  • 如果此pod出现故障,需要重启容器则由kubelet来完成

  • 如果node节点故障了,那么此pod将会消失。便无法实现全局调度。所以不推荐使用此种pod

控制器管理的pod

  • ReplicationController:当启动一个pod时,这个pod如果不够用可以再启一个副本,而后由控制器来管理同一类pod的各种副本与对象。一旦副本少了就会自动增加。采取多退少补的规则,精确符合我们所定义的期望;支持滚动更新

  • ReplicaSet:由一个名叫Deployment的声明式更新的控制器来管理

  • Deployment:Deployment只能管理无状态的应用

  • StateFulSet:有状态副本集,可以管理有状态的应用

  • DaemonSet:如果需要在每个node上运行一个副本的时候可以用DaemonSet

  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务

  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行;以上所有控制器都是用来实现一种特定的应用管理的。

核心组件


HPA

  • Deployment还支持二级控制器

HPA(HorizontalPodAutoscaler,水平pod自动伸缩控制器)

  • —般情况下我们可以确保一个node上有2个pod在运行,万一用户访问流量增加,2个pod不足以承载这么多访问量怎么办?此时我们就应该要增加pod资源,那么到底应该加几个?

  • HPA控制器可自动监控pod、自动进行扩展。

service

  • 假如有2个pod,pod有其生命周期,万一pod所在的节点宕机了,那么此pod将应该要在其他的节点上重建,而重建完的pod与原来的pod已经不是同一个pod了,只是两者都是运行的同一个服务而已。且每个容器都有其IP地址,重建的pod中的容器其P地址与之前的pod中容器的IP地址是不一样的,如此一来就会存在一个问题,客户端如何访问这些pod中的容器呢?

  • 措施:服务发现:就比如集贸市场的注册摊位和声明地址,注册摊位就是买东西的摊位,有一天这个摊位的商贩换地方了,就会在原来的摊位上留下一个摊位声明告诉顾客自己换地方了,但是它出售的商品还是一样的。只是换个地方买而已,这就是服务发现

  • pod是有生命周期的,一个pod随时都有可能离去,随时都有可能会有其他pod加进来,假如它们提供的是同―种服务,客户端是无法通过固定的手段来访问这些pod的,因为pod本身是不固定的,它们随时可能被替换掉,无论使用主机名还是IP地址,都随时会被替换掉。

  • 为了尽可能的降低客户端与pod间协调的复杂度,k8s为每一组提供同类服务的pod和其客户端之间添加了一个中间层,这个中间层是固定的,这个中间层就叫service

  • service只要不被删除,其地址与名称皆是固定的,当客户端需要在其配置文件中写上访问某个服务时,它不再需要自动发现,只需要在配置文件中写明service的名称即可,而这个service是个调度器,其不但能够提供一个稳定的访问入口,还可以做反向代理,当service接收到客户端的请求后,会将其代理到后端的pod之上,一旦pod宕机了会立即新建一个pod,这个新建的pod会立即被service关联上,作为service后端的可用pod之一

  • 客户端程序访问服务都是通过IP+端口或者主机名+端口的方式来实现的。而service关联后端的pod不是靠它的lIP和主机名,而是靠pod的标签选择器。只要创建的pod的label是统一的,无论P地址和主机如何改变,其都能被service所识别。如此一来,只要pod属于标签选择器,只要其在service的管理范围之内,则其就会被关联到service中,当这个动态的pod关联到service中之后,再进行动态的探测此pod的IP地址、端口,再将其作为自己后端可调度的可用服务器主机对象。因此,客户端的请求发送到service,然后由service代理到后端真实的pod中的容器进行响应。

  • service不是一个程序,也不是一个组件,它只是一个iptables的dnat规则

  • service作为k8s的对象,有其自身的名称,而service的名称相当于服务的名称,而这个名称可以被解析。

AddOns附件

  • 装完k8s后第一件事就需要在k8s集群上部署一个dns pod,以确保各service的名称能够被解析

  • 可以动态改变,包括动态创建、动态删除、动态修改

  • 比如把service的名称改了,dnspod会自动触发,将dns解析记录中的名称也给改掉;假如我们手动把service的ip地址给改了,改完以后会自动触发,将dns服务中的解析记录给改掉。

  • 如此一来,客户端去访问pod资源的时候可以直接访问service的名称,然后由集群中专用的dns服务来负责解析。

  • 这种pod是k8s自身的服务就需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,而且它们也被称为集群附件

K8s的三种网络模型

=========================================================================

  • 节点网络

  • service集群网络

  • pod网络

K8s的三种网络模型分属于三个网段,由此延伸出来三个问题

在这里插入图片描述

同一pod内的多个容器间如何通信?

答:用lo网卡

各pod之间如何通信?

答:物理桥桥接 规模大的情况下会产生广播风暴;Overlay Network 通过隧道的方式转发报文

pod与service之间如何通信?

答:首先各节点之间是相互通信的,节点也就是真机之间的通信,因为service网络是一个iptables规则,且与真机是相连的,而pod和service是我们初始化的时候通过flannel网络进行互联,且属于同一网段。

Flannel

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划实现,简单来说,它的功能有以下几点:

  • 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。

  • 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。

  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。

  • 路由信息一般存放到etcd:多个node上的Flanneld依赖一个etcd cluster来做集中配置服务,etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化

  • Flannel首先会在Node上创建一个名为flannel0的网桥(vxlan类型的设备),并且在每个Node上运行一个名为flanneld的代理.每个node上的flannel代理会从etcd上为当前node申请一个CIDR地址块用来给该node上的pod分配地址。

  • Flannel致力于给k8s集群中的nodes提供一个3层网络,他并不控制node中的容器是如何进行组网的,仅仅关心流量如何在node之间流转。

kubectl常用操作

==========================================================================

kubectl命令官方文档

kubeconfig配置文件


[root@master ~]# kubectl config

选项:

Available Commands:

current-context 显示 current_context

delete-cluster 删除 kubeconfig 文件中指定的集群

delete-context 删除 kubeconfig 文件中指定的 context

delete-user Delete the specified user from the kubeconfig

get-clusters 显示 kubeconfig 文件中定义的集群

get-contexts 描述一个或多个 contexts

get-users Display users defined in the kubeconfig

rename-context Renames a context from the kubeconfig file.

set 设置 kubeconfig 文件中的一个单个值

set-cluster 设置 kubeconfig 文件中的一个集群条目

set-context 设置 kubeconfig 文件中的一个 context 条目

set-credentials 设置 kubeconfig 文件中的一个用户条目

unset 取消设置 kubeconfig 文件中的一个单个值

use-context 设置 kubeconfig 文件中的当前上下文

view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件

Usage:

kubectl config SUBCOMMAND [options]

Use “kubectl --help” for more information about a given command.

Use “kubectl options” for a list of global command-line options (applies to all commands).

[root@master ~]# kubectl config view

//集群

apiVersion: v1

clusters:

  • cluster:

certificate-authority-data: DATA+OMITTED

server: https://192.168.129.250:6443

name: kubernetes

//集群上下文

contexts:

  • context:

cluster: kubernetes

user: kubernetes-admin

name: kubernetes-admin@kubernetes

//当前上下文

current-context: kubernetes-admin@kubernetes

kind: Config

preferences: {}

//客户端认证

users:

  • name: kubernetes-admin

user:

client-certificate-data: REDACTED

client-key-data: REDACTED

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 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 的版本信息

Usage:

kubectl [flags] [options]

Use “kubectl --help” for more information about a given command.

Use “kubectl options” for a list of global command-line options (applies to all commands).

kubectl命令使用

==========================================================================

kubectl命令官方文档

create命令


语法:

kubectl create deployment NAME --image=image – [COMMAND] [args…]

选项:

–image 指定镜像

–replicas 创建指定数目的pod

[root@master ~]# kubectl create deployment test1 --image busybox

deployment.apps/test1 created #使用busybox镜像创建一个test1的pod

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

nginx-6799fc88d8-4k6rc 1/1 Running 2 27h

test1-78d64fd9b9-n2f79 0/1 CrashLoopBackOff 3 115s #可以看到处于退出状态,因为busybox使用的是sh,没有任务就会退出

//创建名为test2的部署,用于运行 busybox 映

[root@master ~]# kubectl create deployment test2 --image busybox – sleep 60

deployment.apps/test2 created

[root@master ~]# kubectl get pods

NAME READY STATUS RESTARTS AGE

test1-78d64fd9b9-n2f79 0/1 CrashLoopBackOff 4 3m12s

test2-7c95bf5bcb-s7wzk 1/1 Running 0 49s #运行中

//创建一个名为web的部署,该部署运行具有 3 个副本的 nginx 映像

[root@master ~]# kubectl create deployment web --image nginx --replicas 3

deployment.apps/web created

[root@master ~]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web-96d5df5c8-f9t9x 1/1 Running 0 62s

web-96d5df5c8-m4fnb 1/1 Running 0 62s

web-96d5df5c8-stgdp 1/1 Running 0 62s

//查看pod运行的节点位置

[root@master ~]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

web-96d5df5c8-f9t9x 1/1 Running 0 115s 10.244.1.9 node1

web-96d5df5c8-m4fnb 1/1 Running 0 115s 10.244.1.10 node1

web-96d5df5c8-stgdp 1/1 Running 0 115s 10.244.1.8 node1

//创建一个名为 web01 的部署,该部署运行 nginx映像并公开端口 80

[root@master ~]# kubectl create deployment web01 --image nginx --port=80

deployment.apps/web01 created

[root@master ~]# kubectl get pods

NAME READY STATUS RESTARTS AGE

web01-59859fb9db-tksjv 1/1 Running 0 18s

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

)]
[外链图片转存中…(img-y2QV9fDd-1711923792963)]
[外链图片转存中…(img-cMjO99su-1711923792963)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-QUHYquYk-1711923792964)]

最后

小编精心为大家准备了一手资料

[外链图片转存中…(img-8EyhTEaI-1711923792964)]

[外链图片转存中…(img-RnnrMQNK-1711923792964)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-MNdw3Oki-1711923792965)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-YqGFvpNH-1711923792965)]

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值