部署一个典型的Web应用,API应用,我们通常需要四个东西 Namespace Deployment Service Ingress. 下面的介绍的是 malema 网站用到的东西。
跟C# namespace概念类似,我们把一组相关的服务放在同一个namespace下面。 (k8s集群创建好后,都会自带一些namespace default, kube-system, kube-public)
Deployment 是用来管理Pod我们程序的进程的。 从哪里拿镜像,镜像运行的参数配置,文件的挂载,及探针。
一个Deployment 通常可能有多个的 Pod。哪么外部流量进来的时候要分配到哪一个POD。 就是挂Service来实现的。 简单 的可以理解成 流量先到了 service 然后再到 pod.
要是我们的应用是http,非https。 哪么我们部署一个程序到service这层也是可以的了。 在程序世界当中每增加一层 都会带来一些新的复杂性。 同时也会带来灵活性。
Ingress这层,可以帮我们处理https, Url重写。 节省IP, 自动去 let's encrypt申请证书, 自定义Http头, 处理Cors。 有了这些我们自己的Web服务就可以不用这些功能了。 (一个IP只能绑定一个80 和 443端口。如果没有它来做转发的话,哪么如果我们有多个应用我们就得需要多个IP地址了) 要使用Ingress我们必须安装 IngressController。 下面例子中的 ingressController是 traefik
kubectl create ns malema
切换到当前的 namespace (只能在bash命令行跑。windows借助git是可以直接用Bash)
kubectl config set-context $(kubectl config current-context) --namespace=malema
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
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
没有指定 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
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
kubectl create secret tls tls-2022-6 --key malema.net.key --cert malema.net_bundle.crt