k8s - 01

k8s安装:https://www.cnblogs.com/zhh567/p/16894203.html

结构

  • api server 用于管理各种网络接口,负责组件间的交互和对外暴露接口。
  • etcd 是位于master的数据库
  • kube-scheduler 编排容器
  • kube-controller manager 管理cpu、内存等资源
  • kubelet 接收master发送的命令并进行处理
  • kube-proxy 负责处理k8s的网络请求、负载均衡等
  • kubectl 与 api server 进行交互

常见概念

命名空间 namespace

k8s集群中是实现逻辑上隔离,为组织、安全提供方便。namespace是一组资源和对象的抽象集合,可将系统内部对象划分为不同项目组和用户组。

默认存在的namespace:

  1. default 用户资源默认创建于default命名空间
  2. kube-system k8s系统组件使用
  3. kube-node-lease 集群节点租约状态
  4. kube-public 公共资源使用(现在不常用)
kubectl get pod --all-namespaces
kubectl get pod -A
kubectl get pod                 # 查看default命名空间下资源
kubectl get namespace
kubectl get ns
kubectl create namespace my-ns
kubectl delete namespace my-ns

pod

是一个或多个容器的封装,是k8s的最小调度单元。这些容器共享存储、网络、命名空间。

  • 网络:pod被分配一个唯一ip,内部每个容器共享namespace、ip、端口。pod内可通过localhost的不同端口通信。
  • 存储:pod能被指定共享存储卷的集合,内部容器都能访问共享存储卷。存储卷也可在一个pod持久化,防止其中容器要被重启。

k8s一般通过控制器和模板进行pod的配置和调度,而非直接创建pod。

kubectl get pods
kubectl get pod -o wide # 输出更多信息
kubectl get pods -n my-ns
kubectl get pods -A

# 创建deployment,使用其管理pod
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080 # 不推荐使用命令行创建,用模板创建
# 扩容 pod
kubectl scale --replicas=3 deployment/tomcat9-test   # 每个pod有独立的ip

deployment

作为控制器管理pod,创建的pod都关联到deployment。使用 kubectl delete pod xxx 删除pod后,deployment会自动重新启动一个新的pod。

具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/ 稳定)等功能。

Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用ReplicaSet 。 

kubectl get deployment
kubectl get deployment -o wide
kubectl delete deployments.apps tomcat-test # 删除deployment,对应的pod也被删除

更多控制器:

控制器名称  作用
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模 扩大或剪裁
StatefulSet 有状态副本集(例如MySQL要保存数据),用于发布有状态应用
DaemonSet 在k8s集群每一个Node上运行一个副本, 用于发布监控或日志收集类等应用
Job  运行一次性作业任务
CronJob  运行周期性作业任务

service

为集群外提供服务。service有内部端口外部端口两个不同的端口,分别搭配集群ip和外部ip。

# 创建service用于对外服务
kubectl expose deployment tomcat9-test --name=tomcat9-svc 
    --port=8888         # 暴露给集群内其他应用
    --target-port=8080  # 指定pod端口
    --protocol=TCP
    --type=NodePort     # 生成一个随机的端口用于外部访问,可通过模板指定范围

kubectl get service # 可以看见服务对集群内和对外暴露的端口
kubectl get svc -o wide

kubectl

kubectl [command] [TYPE] [NAME] [flags]
  • command:create get describe delete
  • TYPE:指定资源类型,单数、复数、缩写都可以。
  • NAME:资源名称
    kubectl get pod example-pod1 example-pod2 # 相同类型
    kubectl get pod/example-pod1 replicationcontroller/example-rc1 # 不同类型
    kubectl get pod -f ./pod.yaml            # 通过配置文件指定
# describe 子命令用于查看详细描述
kubectl describe TYPE NAME_PREFIX
kubectl describe pods/nginx
kubectl describe pods
# Describe pods by label name=myLabel
kubectl describe po -l name=myLabel
kubectl describe nodes ubuntu01     # 查看节点
# 进入pod内部执行命令
kubectl exec -it tomcat9-test-d745c83a2b-8xc9 sh
kubectl exec -it tomcat9-test-d745c83a2b-8xc9 -- mkdir /dir00
# 看日志
kubectl logs -f pod-id
# 输出pod格式到yaml文件
kubectl get pod web-pod-13je7 -o yaml
# 强制删除pod
kubectl delete podname --force --grace-period=0

资源文件

应用配置文件:kubectl apply -f lagounamespace.yml
删除指定资源:kubectl delete -f lagounamespace.yml

# 资源清单有5个顶级字段
apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用kubectl apiversions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind:         # 资源类别
metadata:     # 资源元数据
  name
  namespace
  lables
  annotations # 主要目的是方便用户阅读查找
spec:         # 期望的状态(disired state)
status:       # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

---
# 相关类型
apiVersion   <string>              # 表示字符串类型
metadata     <Object>              # 表示需要嵌套多层字段
labels       <map[string]string>   # 表示由k:v组成的映射
finalizers   <[]string>            # 表示字串列表
ownerReferences <[]Object>         # 表示对象列表
hostPID      <boolean>             # 布尔类型
priority     <integer>             # 整型
name         <string> -required-   # 如果类型后面接 -required-,表示为必填字段

查看相关信息:

  • kubectl api-versions
  • kubectl explain pod
# 创建 namespace
apiVersion: v1
kind: Namespace
metadata:
  name: lagou
# 创建 pod
# 注意:使用命令行创建的pod会默认启动一个deployment,使用配置文件创建时不会启动deployment用于重启pod
apiVersion: v1
kind: Pod
metadata:
  name: tomcat9
  labels:
     app: tomcat9
spec:
  containers:
    - name: tomcat9
      image: tomcat:9.0.20-jre8-alpine
      imagePullPolicy: IfNotPresent
  restartPolicy: Always
  
# imagePullPolicy:
#   Always:总是拉取 pull
#   IfNotPresent:如果本地有镜像,使用本地,如果本地没有镜像,下载镜像。
#   Never:只使用本地镜像,从不拉取
# restartPolicy:
#   Always:只要退出就重启。
#   OnFailure:失败退出时(exit code不为0)才重启
#   Never:永远不重启
# 创建 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat-deployment
spec:
  replicas: 3
  template:
    metadata:
      name: tomcat-deployment
      labels:
        app: tomcat
    spec:
      containers:
        - name: tomcat-deployment
          image: tomcat:9.0.20-jre8-alpine
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels: # 在Deployment中必须写matchLables
      app: tomcat # 要和 spec.template.labes.app 对应
# 创建一个 service 和 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deploy
  labels:
    apps: tomcat-deploy
spec:
  replicas: 1
  template:
    metadata:
      name: tomcat-deploy
      labels:
        app: tomcat-pod
    spec:
      containers:
        - name: tomcat-deploy
          image: tomcat:9.0.20-jre8-alpine
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
            - containerPort: 8080
      restartPolicy: Always
  selector:
    matchLabels:
      app: tomcat-pod # 注意于 spec.template.labels.app 要相同

---
# 一个文件中可创建多种资源,使用 --- 分割

apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
spec:
  selector:
    app: tomcat-pod # 对应 Deployment.spec.template.labels.app 内容
  ports:
    - port: 8888         # 集群内访问service使用的端口
      targetPort: 8080   # Pod中容器端口
      nodePort: 30088    # 通过NodePort实现外网用户访问k8s集群内service(30000-32767)
      protocol: TCP
  type: NodePort
#Service 类型
# ClusterIP:   默认,分配一个集群内部可以访问的虚拟IP
# NodePort:    在每个Node上分配一个端口作为外部访问入口
# LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
# ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信

Pod 生命周期

initC阶段是容器初始化步骤,会顺序执行,一直重复直到全部成功。post start、pre stop 是回调函数的调用时机。readiness probe 和 liveness probe 是就绪检测存活检测

initC

  1. 创建在initC阶段依赖其他服务的pod
    一个在initC阶段依赖其他服务的Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: myapp-pod
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp-container
          image: busybox:1.32.0
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c', 'echo The app is running! && sleep3600']
          resources:
            limits:
              memory: 512Mi
              cpu: "1"
      initContainers: # initC 容器,会按顺序执行,一个容器结束后才会执行下一个。所有initC容器退出后才能结束初始阶段
        - name: init-myservice
          image: busybox:1.32.0
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c', 'until nslookup myservice; do echo wating for myservice; sleep 2; done;']
        - name: init-mydb
          image: busybox:1.32.0
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c', 'until nslookup myservice; do echo wating for mydb; sleep 3; done;']
  2. 启动pod后可通过 kubectl logs myapp-pod -c init-myservice 看见 wating for myservice, kubectl describe pod myapp-pod 查看详情,再创建第一个服务
    myservice
     apiVersion: v1
    kind: Service
    metadata:
      name: myservice
    spec:
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9376
  3. 可通过 kebectl logs myapp-pod -c init-mydb 看见 wating for mydb,再创建第二个服务
    mydb
     apiVersion: v1
    kind: Service
    metadata:
      name: mydb
    spec:
      ports:
        - protocol: TCP
          port: 80
          targetPort: 9377
  4. 当两个服务都启动后,pod结束initC阶段

readiness probe

就绪检测,检测通过了才会启动

apiVersion: v1
kind: Pod
metadata:
  name: readinesspod-test
  labels:
    name: readinesspod-test
spec:
  containers:
    - name: readinesspod-test
      image: nginx:1.17.10-alpine
      readinessProbe: # 就绪探针
        httpGet:
          port: 80
          path: /index.html
        initialDelaySeconds: 2 # 初始化时间
        periodSeconds: 3       # 重新检测时间

在这个示例中,只有创建相应的html页面后才能正常启动。

liveness probe

存活检测,如果检测失败就重启

检测文件是否存在,不存在则重启:

apiVersion: v1
kind: Pod
metadata:
  name: livenessprobepod1-test
  labels:
    app: livenessprobepod1-test
spec:
  containers:
    - name: livenessprobepod1-test
      image: busybox:1.32.0
      imagePullPolicy: IfNotPresent
      command: ['sh', '-c', 'touch /tmp/livenesspod; sleep 10; rm -rf /tmp/livenesspod; sleep 3600;']
      livenessProbe:
        exec:
          command: ['sh', '-c', 'test -e /tmp/livenesspod'] # 检测到文件不存在,就会重启容器,因为重启策略是Always
        initialDelaySeconds: 1
        periodSeconds: 3
  restartPolicy: Always

通过能否正常访问http端口,判断pod能够正常提供服务

apiVersion: v1
kind: Pod
metadata:
  name: livenessprobepod2-test
  labels:
    app: livenessprobepod2-test
spec:
  containers:
    - name: livenessprobepod2-test
      image: busybox:1.32.0
      imagePullPolicy: IfNotPresent
      livenessProbe:
        httpGet:
          port: 80
          path: /index.html
        initialDelaySeconds: 1
        timeoutSeconds: 10
  restartPolicy: Always

通过tcp进行存活检测

# 启动后因为无法访问80端口,所以反复重启。容器监听8080端口后pod不再重启
apiVersion: v1
kind: Pod
metadata:
  name: livenesspod3-test
  labels:
    app: livenesspod3-test
spec:
  containers:
    - name: livenesspod3-test
      image: nginx:1.17.10-alpine
      imagePullPolicy: IfNotPresent
      livenessProbe:
        tcpSocket:
          port: 8080
        initialDelaySeconds: 3
        periodSeconds: 3
        timeoutSeconds: 3
  restartPolicy: Always

poststart prestop

钩子程序,在容器开始和结束时调用回调函数

apiVersion: v1
kind: Pod
metadata:
  name: lifecle-test
  labels:
    app: lifecle-test
spec:
  containers:
    - name: lifecle-test
      image: busybox:1.32.0
      imagePullPolicy: IfNotPresent
      command: ['sh', '-c', 'sleep 5000']
      lifecycle:
        postStart: # 容器成功启动后执行命令
          exec:
            command: ['mkdir', '-p', '/tmp/k8s/dir']
        preStop:
          httpGet: # 容器结束前访问指定端口
            scheme: http
            host: www.baidu.com
            port: 80
            path: /
  restartPolicy: Always
posted @ 2023-06-28 13:46  某某人8265  阅读(17)  评论(0编辑  收藏  举报