Kubernetes基础入门

Kubernetes基础入门,第1张

# docker run  --name hello-pod alpine  是跑一个容器,容器的粒度有点小

kubectl run  hello-pod --image=alpine #跑一个Pod。Pod里面其实也是容器

# 
kubectl get pod  #以前的docker ps -a
kubectl get pod -o wide  #查看部署那个节点
## 所有kubectl在master节点运行,把命令请求发给api-server。api-server一系列处理
##  master只负责调度,而worker node才是真正部署应用的。

docker是每一个woker节点的运行时环境
kubelet负责控制所有容器的启动停止,保证节点工作正常,帮助节点交互master

master节点的关键组件:

  1. kubelet(监工):所有节点必备的。控制这个节点所有pod的声明周期以及与api-server交互等工作。
  2. kube-api-server: 负责接收所有请求。集群内对集群的任何修改都是通过命令行,ui 把请求发给api-server才能执行的。api-server是整个 集群 *** 作对内对外的唯一入口、不包含我们后来部署应用暴露端口的方式、
  3. kube-proxy: 整个节点的网络流量负责
  4. cri: 都有容器运行时环境

worker节点:
1.kubelet (监工): 所有节点必备的。控制这个节点所有pod的生命周期以及与api-server交互等工作
2.kube-proxy: 整个节点的网络流量负责
3.cri: 都有容器运行时环境

部署一个应用:

创建一次部署工作。(自愈机制)
1.kubectl create deploy xxxxxxxx: 命令行会给api-server 发送要部署xxx的请求
2.api-server 把这个请求保存到etcd

# kubectl create 帮我们创建k8s集群中的一些对象
kubectl create --help
kubectl create deployment 这次部署的名字 --image=应用的镜像
#Create a deployment named  my-nginx that runs the nginx image
kubectl create deployment my-nginx --image=nginx

##最终在一个机器上有pod、这个pod其实本质里面就是一个容器
k8s_nginx_my-nginx-6b74b79f57-snlr4_default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0
### k8s_镜像(nginx)_pod名(my-nginx-6b74b79f57-snlr4)_容器名(default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0)

# Create a deployment with command
kubectl create deployment my-nginx --image=nginx -- date

# Create a deployment named my-nginx that runs the nginx image with 3 replicas.
kubectl create deployment my-nginx --image=nginx --replicas=3

# Create a deployment named my-nginx that runs the nginx image and expose port 80.
kubectl create deployment my-nginx --image=nginx --port=80
Deployment(部署):

1.在k8s中,通过发布Deployment,可以创建应用程序(docker image)的实例,docker container,这个实例会被包含在称为Pod的概念中,
pod是k8s中最小可以管理单元
2.再k8s集群中发布Deployment后,Deployment将指示k8s如何创建和更新应用程序的实例,master节点将应用程序实例调度到集群中的具体的节点上。
3.创建应用程序实例后,kubernetes Deployment Controller 会持续监控这些实例。如果运行实例的worker节点关机或者被删除,则kubernetes Deployment Controller 将在集群中集中资源最优的另一个worker节点上重新创建一个新的实例。这是提供了一种自我修复机制
来解决机器故障或者维护问题。
4.在容器编排之前的时代,各种安排脚本通常用于启动应用程序,但是不能够使应用程序从机器故障中恢复。通过创建应用实例并确保他们在在集群节点中运行实例个数,Kubernetes Deployment提供了一中完全不同的方式来管理应用程序。
5.Deployment 处于master 节点上,通过发布Deployment, master 节点会选择合适的worker创建Container,Container会被包含在Pod里。

自愈: 针对使用Deployment等部署的应用
kubectl run: 直接启动一个pod; 不会产生一次部署信息。所以删除就没
kubectl create deploy : 启动一个Pod,以及记录这次部署的信息,所以pod即使挂了,这次部署信息有,就会强制同步到这次部署信息期望的最终结果;

kubectl get deploy,pod 都有内容

Pod:

Pod 容器组:是一个k8s中抽象的概念用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:
1.共享存储: 称为卷(Volumes) 即图上紫色圆柱
2. 网络,每个pod 容器组在集群中有一个唯一的IP,pod容器组中的container共享该IP地址
3. container 的基本信息,例如容器的镜像版本,对外暴露的端口


Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。

TIP

重要:

  • Pod 是一组容器(可包含一个或多个应用程序容器),以及共享存储(卷 Volumes)、IP 地址和有关如何运行容器的信息。
  • 如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中。
Node:

**Pod(容器组)**总是在 Node(节点) 上运行。Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。

每个 Kubernetes Node(节点)至少运行:

  • Kubelet,负责 master 节点和 worker 节点之间通信的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。
  • kube-proxy,负责进行流量转发
  • 容器运行环境(如Docker)负责下载镜像、创建和运行容器等。
kubeadm init \
--apiserver-advertise-address=10.170.11.8 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

--pod-network-cidr=192.168.0.0/16:pod 的ip范围

calico:网络组件:
【扁平化网络】
故障排除:

kubeclt get --显示资源列表

# kubectl get 资源类型

#获取类型为Deployment的资源列表
kubectl get deployments

#获取类型为Pod的资源列表
kubectl get pods

#获取类型为Node的资源列表
kubectl get nodes
# 查看所有名称空间的 Deployment
kubectl get deployments -A
kubectl get deployments --all-namespaces
# 查看 kube-system 名称空间的 Deployment
kubectl get deployments -n kube-system
#####并不是所有的对象都在名称空间中

# 在名称空间里
kubectl api-resources --namespaced=true

# 不在名称空间里
kubectl api-resources --namespaced=false

kubectl describe - 显示有关资源的详细信息

# kubectl describe 资源类型 资源名称

#查看名称为nginx-XXXXXX的Pod的信息
kubectl describe pod nginx-XXXXXX	

#查看名称为nginx的Deployment的信息
kubectl describe deployment my-nginx	

kubectl logs - 查看pod中的容器的打印日志(和命令docker logs 类似)

# kubectl logs Pod名称

#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-pod-XXXXXXX

kubectl exec - 在pod中的容器环境内执行命令(和命令docker exec 类似)

# kubectl exec Pod名称  *** 作命令

# 在名称为nginx-pod-xxxxxx的Pod中运行bash
kubectl exec -it nginx-pod-xxxxxx /bin/bash

### 注意:新版1.21.0 提示这个命令会过期

kubectl run:

## kubectl run --help
kubectl run nginx --image=nginx

总结:

kubectl create 资源  #创建任意资源
kubectl create deploy #创建部署
kubectl run #只创建一个Pod
kubectl get 资源名(node/pod/deploy) -n xxx(指定名称空间,默认是default) #获取资源
kubectl describe  资源名(node/pod/deploy)  xxx #描述某个资源的详细信息
kubectl logs 资源名 ##查看日志
kubectl exec -it pod名 -- 命令  #进pod并执行命令
kubectl delete 资源名(node/pod/deploy) xxx  #删除资源
Kubernetes Service 总览:
  • Kubernetes Pod 是转瞬即逝的。
  • Pod 实际上拥有 生命周期。 当一个工作 Node 挂掉后, 在 Node 上运行的 Pod 也会消亡。
  • ReplicaSet 会自动地通过创建新的 Pod 驱动集群回到目标状态,以保证应用程序正常运行。

Kubernetes 的 Service 是一个抽象层,它定义了一组 Pod 的逻辑集,并为这些 Pod 支持外部流量暴露、负载平衡和服务发现。

  • ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问。
  • NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集。
  • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集。
  • ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本。
Service 和 Label:


Service 通过一组 Pod 路由通信。Service 是一种抽象,它允许 Pod 死亡并在 Kubernetes 中复制,而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由Kubernetes Service 处理的。

Service 匹配一组 Pod 是使用 标签(Label)和选择器(Selector), 它们是允许对 Kubernetes 中的对象进行逻辑 *** 作的一种分组原语。标签(Label)是附加在对象上的键/值对,可以以多种方式使用:

  • 指定用于开发,测试和生产的对象
  • 嵌入版本标签
  • 使用 Label 将对象进行分类
将Pod封装为Service:

# 查看pod的标签
kubectl get pod --show-labels



这样就创建了一个service 访问8181就可以负载均衡这个service下面的所有pod

kubectl expose:
 kubectl expose deployment tomcat6 --port=8912 --target-port=8080 --type=NodePort
 
 ## --port:集群内访问service的端口 8912
 ## --target-port: pod容器的端口 8080
 ## --nodePort: 可以使用公网IP访问每个机器开发的端口 30403
 ## --type=ClusterIP (NodePort)指定访问类型 , 可以是serviceIP也可以是nodeIp
 
 kubectl expose deploy my-nginx2 --port=88 --target-port=80 --type=ClusterIP

 ## 进行验证
 kubectl get svc 
 curl ip:port
 
 kubectl expose  #暴露,成一个负载均衡网络
 ## kubectl exec 进去pod修改,并测试负载均衡
#查看节点标签
kubectl get node --show-labels

#给node2节点打标签
 kubectl label node k8s-02 node-role.kubernetes.io/worker=''



给pod打标签:

伸缩应用程序-扩缩容:

目标

  • 用 kubectl 扩缩应用程序
  • 扩缩一个 Deployment
    我们创建了一个 Deployment ,然后通过 服务提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要对应用程序进行伸缩 *** 作以满足系统性能需求。
#创建一次部署
kubectl create deploy my-nginx --image=nginx
#查看所有信息
kubectl get deploy,pod  -owide

# 查看扩容命令帮助
kubectl scale --help


# 扩容nginx deploy 为3个
kubectl scale --replicas=3  deploy  my-nginx



# 一秒监控一次
 watch -n 1 kubectl get deploy 

扩容完毕;

缩容:

#缩容
kubectl scale --replicas=1  deploy  my-nginx

扩缩容适应高并发流量;

滚动升级:
#查看pod的详细信息并按照yaml格式显示
kubectl get pod my-nginx-6b74b79f57-4zsvk -o yaml|grep image

#升级nginx的版本 如果版本号不存在不会影响之前的正常运行的进行,有可用百分比,正常杀死一个启动两个
kubectl set image deploy my-nginx nginx=nginx:1.9.1


#升级时加上--record  会记录在历史记录里面
 kubectl set image deploy my-nginx nginx=nginx:1.9.2 --record
# 查看历史记录
kubectl rollout history deploy my-nginx

# 回滚到指定版本 每次undo 回滚一个版本
 kubectl rollout undo deploy my-nginx --to-revision=1 

#应用升级: tomcat:alpine、tomcat:jre8-alpine
# kubectl set image deployment/my-nginx2  nginx=nginx:1.9.1

##联合jenkins 形成持续集成,灰度发布功能
kubectl set image deployment.apps/tomcat6 tomcat=tomcat:jre8-alpine #可以携带--record参数,记录变更


##回滚升级
### 查看历史记录
kubectl rollout history deployment.apps/tomcat6
kubectl rollout history deploy tomcat6

### 回滚到指定版本
kubectl rollout undo deployment.apps/tomcat6 --to-revision=1
kubectl rollout undo deploy tomcat6 --to-revision=1
使用配置文件方式:

部署一个应用:

apiVersion: apps/v1	#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment	#该配置的类型,我们使用的是 Deployment
metadata:	        #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment	#Deployment 的名称
  labels:	    #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx	#为该Deployment设置key为app,value为nginx的标签
spec:	        #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1	#使用该Deployment创建一个应用程序实例
  selector:	    #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:	    #这是选择或创建的Pod的模板
    metadata:	#Pod的元数据
      labels:	#Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:	    #期望Pod实现的功能(即在pod中部署)
      containers:	#生成container,与docker中的container是同一种
      - name: nginx	#container的名称
        image: nginx:1.7.9	#使用镜像nginx:1.7.9创建container,该container默认80端口可访问

使用文件部署:
kubeclt apply -f deploy1.yaml

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/719713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存