美文网首页
K8s学习(四):运行应用

K8s学习(四):运行应用

作者: 呦丶耍脾气 | 来源:发表于2024-05-12 16:35 被阅读0次

1. 简述

本篇文章主要讲解内容如下:

  • Kubernetes运行应用流程。
  • 学习涉及到的相关概念和术语。

2. 运行应用流程

Docker的世界中,调度的原子单位是容器;而在Kubernetes的世界中,调度的原子单位是Pod,应用都是运行在Pod中,管理应用,就是在管理Pod;用户无法直接在Kubernetes集群中运行一个容器,容器必须并且总是需要在Pod中才能运行。

2.1 创建Deployment

Kubernetes通过各种Controller来管理Pod的生命周期。为了满足不同业务场景,Kubernetes开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。最常用的是Deployment

a. 编写配置

cat <<EOF >  /root/k8s/httpd_deployment.yaml
apiVersion: apps/v1 # 配置格式版本
kind: Deployment   #资源类型,Deployment
metadata: 
  name: httpd-deployment #Deployment 的名称
spec: 
  replicas: 2   # 副本数量
  selector:   #标签选择器,
    matchLabels: #选择包含标签app:httpd_server的资源
      app: httpd_pod 
  template:    #Pod模板信息
    metadata:   
      labels:  #Pod的标签
        app: httpd_pod
    spec: 
      containers: 
      - name: httpd #container的名称
        image: httpd #使用镜像httpd
EOF

b. 创建资源

# 创建资源
$ kubectl apply -f /root/k8s/httpd_deployment.yaml

# 查看创建的pod
$ kubectl get pod
NAME                                    READY   STATUS    RESTARTS      AGE
pod/curl                                1/1     Running   2 (23h ago)   45h
pod/httpd-deployment-65f7496c48-d22g7   1/1     Running   0             4m23s
pod/httpd-deployment-65f7496c48-lfnz5   1/1     Running   0             4m26s

查看创建deployment

$ kubectl get deployment
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/httpd-deployment   2/2     2            2           4m33s

c. 访问资源

# 查看Pod IP信息
$ kubectl get pod -o wide
NAME                                READY   STATUS    ...        IP     NODE   ...
httpd-deployment-65f7496c48-d22g7   1/1     Running   10.244.166.154   node1   
httpd-deployment-65f7496c48-lfnz5   1/1     Running   10.244.104.6     node2   
# 访问Pod
$ curl 10.244.166.154
<html><body><h1>It works!</h1></body></html>
$ curl 10.244.104.6
<html><body><h1>It works!</h1></body></html>

2.2 创建Service

Kubernetes中,Pod是极不稳定的,随时可能会因为故障或者其他原因死掉,虽然每个Pod都有IP,但是当Controller用新Pod替代死掉的Pod时,新Pod会分配到新的IP地址。这样就会产生了一个问题: 如果一组Pod对外提供服务(比如HTTP),它们的IP很有可能发生变化,那么客户端如何找到并访问这个服务呢?

Kubernetes给出的解决方案是Service。

a. 编写配置

$ cat <<EOF > /root/k8s/httpd_service.yaml
apiVersion: v1 # 配置格式版本
kind: Service   #资源类型,Service
metadata: 
  name: httpd-src #service名称
spec:
  selector:
    app: httpd_pod #关联 lable为app: httpd_pod的Pod
  ports:
  - name: http
    protocol: TCP
    port: 8080 # ClusterIP监听的端口
    targetPort: 80 # Pod监听的端口
EOF

b. 创建资源

# 创建
$ kubectl apply -f httpd_service.yaml
service/httpd-src created
# 查看service
$ kubectl get service -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE     SELECTOR
httpd-src    NodePort    10.110.44.87   <none>        8080/TCP   4m20s   app=httpd_pod
..

c. 访问验证

# 访问,通过 kubectl logs -f pod名称 可以发现是轮询访问 
$ curl 10.110.44.87:8080
<html><body><h1>It works!</h1></body></html>

d. 暴露外网访问

除了Cluster内部可以访问Service,很多情况下我们也希望应用的Service能够暴露给Cluster外部。Kubernetes提供了多种类型的Service,默认是ClusterIP。我们可以修改类型为NodePort,来实现外部访问。

修改配置文件:

apiVersion: v1 
kind: Service 
metadata: 
  name: httpd-src 
spec:
  type: NodePort # 这里设置成NodePort
  selector:
    app: httpd_pod 
  ports:
  - name: http
    protocol: TCP
    nodePort: 30000 # 指定nodePort端口,限制范围为:30000-32767
    port: 8080
    targetPort: 80

覆盖发布:

# 发布
$ kubectl apply -f httpd_service.yaml
# 查看service 
$ kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
httpd-src    NodePort    10.110.44.87   <none>        8080:30000/TCP   17m...

master节点ip是192.168.77.133, 访问 http://192.168.77.133:30000/

image.png

3. 概念

3.1 Pod

Kubernetes并不直接运行容器,而是使用一个抽象的资源对象来封装一个或者多个容器,这个抽象即为Pod,它也是Kubernetes的最小调度单元。

同一Pod中的容器共享网络名称空间和存储资源(Volume),但彼此之间又在Mount、User及PID等名称空间上保持了隔离。

尽管Pod中可以包含多个容器,但是作为最小调度单元,它应该尽可能地保持“小”,即通常只应该包含一个主容器,以及必要的辅助型容器(sidecar)

3.2 Deployment

DeploymentKubernetes控制器的一种实现,它构建于ReplicaSet控制器之上,可为PodReplicaSet资源提供声明式更新。相比较而言,PodReplicaSet是较低级别的资源,它们很少被直接使用。

Deployment、ReplicaSetPod的关系如下图所示

Deployment控制器资源的主要职责同样是为了保证Pod资源的健康运行,其大部分功能均可通过调用ReplicaSet控制器来实现,同时还增添了部分特性:

  • 事件和状态查看:可以查看升级的详细进度和状态。
  • 回滚:当升级Pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到指定的版本。
  • 版本记录:每一次对Deployment的操作都能保存下来,给予后续可能的回滚使用。
  • 暂停和启动:对于每一次升级,都能够随时暂停和启动。
  • 多种自动更新方案:
    • Recreate(重建更新):删除所有已存在的Pod,重新创建新的。
    • RollingUpdate(滚动更新):逐步替换旧有的Pod至新的版本。

3.3 Service

ServiceKubernetes的核心资源类型之一,通常可看作微服务的一种实现。事实上它是一种抽象:通过规则定义出由多个Pod对象组合而成的逻辑集合,以及访问这组Pod的策略。

Service资源基于标签选择器将一组Pod定义成一个逻辑组合,并通过自己的IP地址和端口调度代理请求至组内的Pod对象之上,如下图所示:

相关文章

  • 批处理及有状态等应用类型在 K8S 上应该如何配置?

    众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型...

  • 【k8s系列1】spark on k8s 与 spark on

    对于目前基于k8s的的spark应用,主要采用两种方式运行 spark原生支持的 spark on k8s[htt...

  • Testops之路6.Kubernetes之Pod

    先来一起回忆一下上节课内容,k8s的几个组成部分: 研发采用声明式定义自己的应用: 应用运行在k8s集群上的全景图...

  • 传统应用迁移到容器应考虑的问题

    在将银行的传统核心等应用迁移到k8s + docker上运行时, 需要重点关注的问题 : 应用日志如何存放 ? ...

  • Class1:周记

    Android系统架构分为四层:Linux内核层、系统运行层、应用框架层和应用层(四层中将重点学习应用层)。 An...

  • k8s 持久化存储卷

    在k8s中为什么要做持久化存储? 在 k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Re...

  • K8S集群思维导图

    之前学习了docker及其基本的实践应用,k8s作为docker的最佳实践。有必要对k8s进行系统性的学习与总结,...

  • K8s初识

    K8s基本概念 Master是主服务器,node是用于部署应用容器的服务器。 Pod基本操作单元,也是应用运行的载...

  • K8S 基础概念

    K8S概念指南 Cluster :集群是指由k8s使用一些列的物理机,虚拟机和其他基础资源来运行你的应用程序. N...

  • understanding k8s objects

    k8s对象是k8s系统中的持久性实体,他使用这些实体去表示集群状态,描述为:正在运行的容器化应用程序(以及在哪个节...

网友评论

      本文标题:K8s学习(四):运行应用

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