Kubernetes基本概念

本文记录博主在学习Kubernetes中碰到的一些基础概念,希望对大家也能有所帮助。

Pod

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

通过命令行创建Pod

# 创建pod,pod中容器镜像选择nginx
kubectl run mynginx --image=nginx
# 查看default名称空间的Pod
kubectl get pod 
# 描述
kubectl describe pod 你自己的Pod名字
# 删除
kubectl delete pod Pod名字
# 查看Pod的运行日志
kubectl logs Pod名字

# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136

# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod

通过yaml创建Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat
  • Pod内的容器不能使用相同的端口,否则会认为Pod启动失败,导致不断重启重试。
  • 目前Pod只可以在集群内进行访问

Deployment

控制、管理Pod,使Pod拥有多副本,自愈,扩缩容等能力

创建Pod副本和扩缩容

通过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 # 容器名称

修改副本数量

kubectl scale --replicas=5 deployment/my-dep

滚动更新

#修改部署中的nginx版本
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
#查看部署的状态
kubectl rollout status deployment/my-dep
# 修改部署文件 
kubectl edit deployment/my-dep

版本回退

#历史记录
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

Service

通过Pod的创建时标签,可以把相同作用的Pod提取出来,组成一个整体,对外提供服务,实现负载均衡。

Service可以整合Pod,提供给外部或者内部访问。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  selector:
    app: my-dep
  ports:
  - port: 8000 #service端口
    protocol: TCP
    targetPort: 80 #Pod的端口
  type: ClusterIP #ClusterIP是在集群中可以访问,NodePort是外部可以访问

Ingress

Ingress不同上面的资源,需要进行安装才能使用,没安装可以参考Ingress安装教程,。

Ingress类似nginx,将用户的访问路由到不同的service,可以用来做反向代理、负载均衡、限流等,更多功能参考Ingress官方文档

image-20221209154235053

准备测试环境

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello-server
  template:
    metadata:
      labels:
        app: hello-server
    spec:
      containers:
      - name: hello-server
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
        ports:
        - containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-server
  name: hello-server
spec:
  selector:
    app: hello-server
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 9000

通过yaml配置路由规则

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: ingress-host-bar  #Ingress名称
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.hanjiang.com"
    http:
      paths:
      - pathType: Prefix #Prefix前缀匹配模式  Exact精确匹配模式
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000 #服务的端口号
  - host: "demo.hanjiang.com"
    http:
      paths:
      - pathType: Prefix #Prefix前缀匹配模式  Exact精确匹配模式
        path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000 #服务的端口号

路径重写

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.hanjiang.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.hanjiang.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

流量限制

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-limit-rate
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "1" #限制每秒钟只能访问1次,超过限制进入503页面
spec:
  ingressClassName: nginx
  rules:
  - host: "haha.hanjiang.com"
    http:
      paths:
      - pathType: Exact
        path: "/"
        backend:
          service:
            name: nginx-demo
            port:
              number: 8000

存储抽象

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

通过yaml创建PV

建新文件夹

#nfs主节点,创建文件夹
mkdir -p /nfs/data/01

创建pv.yaml文件

apiVersion: v1
kind: PersistentVolume #资源类型
metadata:
  name: pv01-10m #名称
spec:
  capacity:
    storage: 512M #卷的大小
  accessModes:
    - ReadWriteMany #读写权限
  storageClassName: nfs #存储类名称
  nfs:
    path: /nfs/data/01 #挂载文件夹路径
    server: 192.168.64.128 #nfs的主服务器地址

应用yaml文件即可创建PV

使用PVC申请PV

PVC也是资源的一种

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi #申请的大小
  storageClassName: nfs #存储类名称

创建Pod绑定PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

ConfigMap

抽取应用配置,并且可以自动更新

#创建文件
vim redis.conf
# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf

配置集的yaml

apiVersion: v1
data:    #data是所有真正的数据,key:默认是文件名   value:配置文件的内容
  redis.conf: |
    appendonly yes
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: default

创建pod绑定配置集

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

需要注意,更新配置集后redis的运行状态并不会改变,需要重启redis,只有具有热更新能力的中间件才能做到配置自动生效

Secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。

kubectl create secret docker-registry leifengyang-docker \
--docker-username=caoyu\
--docker-password=caoyuxxxx\
--docker-email=117090841@qq.com

以后创建pod需要拉取私人镜像,会去该账号下寻找