Namespace deployment service ingress

部署一个典型的Web应用,API应用,我们通常需要四个东西 Namespace Deployment Service Ingress. 下面的介绍的是 malema 网站用到的东西。

1. Namespace

跟C# namespace概念类似,我们把一组相关的服务放在同一个namespace下面。 (k8s集群创建好后,都会自带一些namespace default, kube-system, kube-public)

2. Deployment

Deployment 是用来管理Pod我们程序的进程的。 从哪里拿镜像,镜像运行的参数配置,文件的挂载,及探针。

3. Service

一个Deployment 通常可能有多个的 Pod。哪么外部流量进来的时候要分配到哪一个POD。 就是挂Service来实现的。 简单 的可以理解成 流量先到了 service 然后再到 pod.

4. Ingress

要是我们的应用是http,非https。 哪么我们部署一个程序到service这层也是可以的了。 在程序世界当中每增加一层 都会带来一些新的复杂性。 同时也会带来灵活性。

Ingress这层,可以帮我们处理https, Url重写。 节省IP, 自动去 let's encrypt申请证书, 自定义Http头, 处理Cors。 有了这些我们自己的Web服务就可以不用这些功能了。 (一个IP只能绑定一个80 和 443端口。如果没有它来做转发的话,哪么如果我们有多个应用我们就得需要多个IP地址了) 要使用Ingress我们必须安装 IngressController。 下面例子中的 ingressController是 traefik

Namespace 示例文件

kubectl create ns malema

切换到当前的 namespace (只能在bash命令行跑。windows借助git是可以直接用Bash)

kubectl config set-context $(kubectl config current-context) --namespace=malema

imagePullSecrets

Deployment在拉取镜像的时候需要提供 ddocker registry的用户名和密码。否则的话它是没有办法拉取镜镜的。通过下面的命令我们可以创建 docker-registry的 secret

kubectl create secret docker-registry registrykeymalema --docker-server=https://malema-docker.pkg.coding.net/malema --docker-username=yourdockerusername --docker-password=yourdockerPassword --docker-email=admin@malema.net 
pause

deployment 示例文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web # app的名称
  name: web
  namespace: malema # 刚刚创建的namespace
spec:
  replicas: 2 # 几个实例同时在跑 也可以理解成 几个进程
  selector:
    matchLabels:
      app: web # 跟上面的一样
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: malema-docker.pkg.coding.net/malema/malema/malema-web:72 # docker image所在的位置
          imagePullPolicy: IfNotPresent
            
          env: # 环境变量. Asp.net 的程序通常是用 IConfiguration这个东西支持从 配置文件 环境变量当中读取到配置
              - name: ConnectionString
                value: sqlserver connection string # 放上你自己的 (更多的配置信息的话可以放到 configmap)
          ports:
            - containerPort: 80 #指出这个Container 用的80端口。 没有实际的作用
          readinessProbe: # 就绪探针
            httpGet:
              path: /health
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
            timeoutSeconds: 5
          resources:
            requests:
              memory: 500Mi # 内存请求资源, 测试环境 常用的内存 正式环境 比常用的内存大一些。
              cpu: 50m # cpu 请求 测试环境, 测试环境 使用率都比较低 50m 基本就够了 
                      # 正式环境 写入 80分位 或 90分位 cpu 使用率
            limits:
              memory: 2560Mi # 内存限制 内存限制不住的。 超过的话是会自动重启的。
                             # live环境要放一个正常使用时不太可能达到的值。
              cpu: 800m    # cpu 限制, 限得住, 可能会导致应用卡 或者慢。要配置HorizontalPodAutoscaler 自动升实例 
        imagePullSecrets:
          - name: registrykeymalema #上面命令创建出的 secret

service 示例文件

没有指定 type的情况下默认用的是ClusterIP.K8s集群的内部IP (不是节点的内部IP)

apiVersion: v1
kind: Service
metadata:
  name: web # service的名字也叫 web 当然也可以不叫web
  namespace: malema
spec:
  #type: LoadBalancer 没写的情况下默认是 ClusterIP
  selector:
    app: web ## 跟pod的app 一样 
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

ingress 示例文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: malema-ingress
  namespace: malema   #你自己的namespace
  annotations:
    # namespace-name@kubernetescrd
    traefik.ingress.kubernetes.io/router.middlewares: malema-https@kubernetescrd
spec:
  # ingressClassName: traefik #有多个 ingress className的时候要指定
  tls:
    - hosts:
      - www.malema.net              #批定域名
      secretName: tls-2022-6   #证书的名字 在下面会介绍到如何创建
    - hosts:
      - malema.net
      secretName: tls-2022-6
  rules:
  - host: www.malema.net
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web #service的名字
            port:
              number: 80 # service的端口         
  - host: malema.net
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 80
--- #可以把多个配置信息放到同一个文件里面 使用三个-来隔开
## traefik 自动跳转到https 跟nginx ingress的写法不太一样
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: https
  namespace: malema   #你自己的namespace
spec:
  redirectScheme:
    scheme: https

创建证书的 secret

kubectl create secret tls tls-2022-6 --key malema.net.key --cert malema.net_bundle.crt
最近更新的
...