十一 【Kubernetes】K8s笔记:Ingress 集群进出流量总管( 三 )


在使用 kubectl 的主机上首先克隆仓库并进入部署文件夹:
$ git clone https://github.com/nginxinc/kubernetes-ingress.git --branch v2.4.1$ cd kubernetes-ingress/deploymentsNginx Ingress Controller 的安装略微麻烦一些,有很多个 YAML 需要执行,但如果只是做简单的试验,就只需要用到 4 个 YAML:
$ kubectl apply -f common/ns-and-sa.yamlnamespace/nginx-ingress createdserviceaccount/nginx-ingress created$ kubectl apply -f rbac/rbac.yamlclusterrole.rbac.authorization.k8s.io/nginx-ingress createdclusterrolebinding.rbac.authorization.k8s.io/nginx-ingress created$ kubectl apply -f common/nginx-config.yamlconfigmap/nginx-config created$ kubectl apply -f common/default-server-secret.yamlsecret/default-server-secret created前两条命令为 Ingress Controller 创建了一个独立的名字空间 nginx-ingress,还有相应的账号和权限,这是为了访问 apiserver 获取 Service、Endpoint 信息用的;后两条则是创建了一个 ConfigMap 和 Secret,用来配置 HTTP/HTTPS 服务 。
接下来我们还需要部署一些 Custom Resources,没有它们我们部署的 Ingress Controller 就无法运行:

默认情况下,需要为虚拟服务器、虚拟服务器路由、传输服务器和策略创建自定义资源的定义 。否则,Ingress Controller Pod 将不会变为 Ready 状态 。如果要禁用该要求,请将 -enable-custom-resources 命令行参数配置为 Readyfalse 并跳过此部分 。
$ kubectl apply -f common/crds/k8s.nginx.org_policies.yamlcustomresourcedefinition.apiextensions.k8s.io/policies.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yamlcustomresourcedefinition.apiextensions.k8s.io/transportservers.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yamlcustomresourcedefinition.apiextensions.k8s.io/virtualserverroutes.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yamlcustomresourcedefinition.apiextensions.k8s.io/virtualservers.k8s.nginx.org created部署 Ingress Controller 不需要我们自己从头编写 Deployment,Nginx 已经为我们提供了示例 YAML (位置是:kubernetes-ingress/deployments/deployment/nginx-ingress.yaml),现在我们对其进行一些小小的改动:
  • metadata 里的 name 要改成自己的名字,比如 ngx-ing-dep
  • spec.selectortemplate.metadata.labels 也要修改成自己的名字,比如还是用 ngx-ing-dep
  • containers.image 可以改用 apline 版本,加快下载速度,比如 nginx/nginx-ingress:2.2-alpine
  • 最下面的 args 要加上 -ingress-class=ngx-ink,也就是前面创建的 Ingress Class 的名字,这是让 Ingress Controller 管理 Ingress 的关键
apiVersion: apps/v1kind: Deploymentmetadata:name: ngx-ing-depnamespace: nginx-ingressspec:replicas: 1selector:matchLabels:app: ngx-ing-deptemplate:metadata:labels:app: ngx-ing-depspec:serviceAccountName: nginx-ingressautomountServiceAccountToken: truecontainers:- image: nginx/nginx-ingress:2.2-alpineimagePullPolicy: IfNotPresentname: nginx-ingressports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443- name: readiness-portcontainerPort: 8081- name: prometheuscontainerPort: 9113readinessProbe:httpGet:path: /nginx-readyport: readiness-portperiodSeconds: 1resources:requests:cpu: "100m"memory: "128Mi"securityContext:allowPrivilegeEscalation: truerunAsUser: 101 #nginxrunAsNonRoot: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICEenv:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.nameargs:- -nginx-configmaps=$(POD_NAMESPACE)/nginx-config- -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret- -ingress-class=ngx-ink

经验总结扩展阅读