Skip to content

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 示例文件 ​

bash
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

bash
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 示例文件 ​

yaml
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)

yaml
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 示例文件 ​

yaml
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 ​

bash
kubectl create secret tls tls-2022-6 --key malema.net.key --cert malema.net_bundle.crt

简单就是美