k8s 中所有的资源都有对应的控制器在操控这个资源,管理资源的生命周期,实现”声明式“效果。Deployment、Service、Replicaset等资源的控制器封装在k8s内置的 controller-manager进程中。
对于外部请求如何进入集群内部,K8s 官方定义了 Ingress 这个资源,但是官方并没有提供 Ingress 的控制器,使用时必须手动安装一个 Ingress controller。云厂商有自己的 ingress controller,开源界也有一下 ingress controller :
所有的 Ingress 都包括数据面和控制面,控制面负责监听 k8s 资源,生成配置,下发给数据面。
Nginx Ingress 作为使用广泛的 Ingress,底层基于 Nginx,动态生成 nginx.conf 文件,实现将请求重定向到pod内部的目的。
nginx 的优点在于周边生态丰富,和传统运维无缝集成,不需要更多的学习成本。但是缺点在于热加载的支持不友好,需要重启服务。云原生时代 envoy 逐渐占据风头,出现大量基于 envoy 的 Ingress。
有两种方式安装 nginx-ingress:helm 和 kubectl apply
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml
# 查看 pod 状态
kubectl get pods -n ingress-nginx
# 或者监听 pod 启动
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=120s
使用 nginx lua 模块,只更新 endpoint 不会reload,在大集群、大量的服务部署更新的情况下可以减少延迟
kubectl get ing -n <ns>
kubectl describe ing <name> -n <ns>
kubectl get pods -n <ns>
kubectl logs -n <ns> <name>
kubectl get pods -n <ns>
kubectl exec -it -n <ns> <name> -- cat /etc/nginx/nginx.conf
kubectl get svc -A
使用 --v=XX 参数可以增加日志等级,修改 deployment 文件
kubectl get deploy -n <ns>
kubectl edit deploy -n <ns> <name>
# 增加 --v=X 到 - args
有三种方式可以自定义 nginx 的配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myservicea
spec:
ingressClassName: nginx
rules:
- host: myservicea.foo.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myservicea
port:
number: 80undefined apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myserviceb
annotations: # use the shared ingress-nginx
kubernetes.io/ingress.class: "nginx" spec:
rules:
- host: myserviceb.foo.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myserviceb
port:
number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myservicea
spec:
rules:
- host: myservicea.foo.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myservicea
port:
number: 80
ingressClassName: nginxundefined apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-myserviceb
spec:
rules:
- host: myserviceb.foo.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myserviceb
port:
number: 80
ingressClassName: nginx
log_format upstreaminfo
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'$request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr '
'$upstream_response_length $upstream_response_time $upstream_status $req_id';
注解的 key 和 value 只支持 string,因此 bool 或者 int 必须使用引号。比如 “ture”、“100”、“false” 注解的前缀默认是 “nginx.ingress.kubernetes.io",可以通过 --annotations-prefix 命令修改
nginx.ingress.kubernetes.io/canary-by-cookie
: nginx.ingress.kubernetes.io/canary-weight
: nginx.ingress.kubernetes.io/canary-weight-total
: 总权重,默认100优先级关系:
canary-by-header > canary-by-cookie -> canary-weight
Nginx load balance 基于一致性哈希
nginx.ingress.kubernetes.io/upstream-hash-by-subset
: "true"代码段全部追加到 nginx 的 location 配置中
在多住户集群中,这是一个危险操作,会导致其他权限限制之外的人可以获取到集群中所有的 secret 官方推荐禁用此功能,参考 configuration snippet
nginx.ingress.kubernetes.io/cors-allow-methods
: "PUT, GET, POST, OPTIONS"nginx.ingress.kubernetes.io/cors-allow-headers
: nginx.ingress.kubernetes.io/cors-allow-origin
:nginx.ingress.kubernetes.io/cors-allow-credentials
: nginx.ingress.kubernetes.io/cors-max-age
: 追加 server 配置中的 server_name 字段值
添加配置代码到 server 配置项中
这个注解在每个host 中只能使用一次
nginx-ingress 使用 opentracing-contrib/nginx-opentracing 模块支持 opentracing,默认该特性的关闭的
configmap 中新增如下字段
data:
enable-opentracing: "true"
ingress 配置中新增如下注解
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-opentracing: "true"
opentracing-XXX
zipkin-XXX
jaeger-XXX
datadlog-XXX
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。