运行 具有 hostNetwork 的 Ingress 控制器:true
Running an Ingress controller with hostNetwork: true
在研究一个 Stack Overflow 的解决方案时,我 运行 陷入了一个单独的困惑点。我不确定如何搜索这个问题的答案,因为有太多我不理解的潜在部分。
情况
我想 运行 hostNetwork
上的 Ingress 控制器(用于开发目的)。到目前为止我学到的是我可以用这样的配置文件创建一个 Ingress 控制器:
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
web
是什么并不重要,只是它是我集群中的一项服务 运行。
在我上面链接的问题中,我被指示“安装 nginx 入口控制器并在 deployment.yaml 中使用 hostNetwork: true”。
我还没有为这个项目创建 deployment.yaml,但我的理解是它用于定义 Pods,以及我希望那些 pods 如何随副本集扩展.
问题
部署是否仅用于定义 Pods(正如我目前的理解),还是我也可以在其中包含我的 service/ingress?无论哪种情况,我应该在哪里定义 hostNetwork: true
指令? (注意:所有这些的目的是打开端口 80 并将其指向我的 Ingress 控制器,所以我只想在 Pods 上设置 hostNetwork: true
似乎不正确他们自己。)
安装 nginx 入口控制器后,命名空间 ingress-nginx
中应该有一个部署 ingress-nginx-controller
。您需要修改部署。您可以使用
对其进行编辑
kubectl edit deploy ingress-nginx-controller -n ingress-nginx
并在 pod 规范部分添加 hostNetwork: true
...
spec:
hostNetwork: true
containers:
- name: controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0
...
这并不明显。 Ingress 资源控制器使用 .yaml 部署(例如 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml)
这个 yaml 中有很多东西 - 一个资源是部署。如果像我一样,您要部署到裸机专用 LAN 环境中,则可以将 hostNetwork 设置为 true。所以 - wget 它(wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml),并修改它以设置 Deployment 规范的模板规范,以便 hostNetwork: true - 类似于(向下滚动到末尾):
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.6
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.0.4
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
containers:
- name: controller
image: k8s.gcr.io/ingress-nginx/controller:v1.0.4@sha256:545cff00370f28363dad31e3b59a94ba377854d3a11f18988f5f9e56841ef9ef
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LD_PRELOAD
value: /usr/local/lib/libmimalloc.so
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
- name: webhook
containerPort: 8443
protocol: TCP
volumeMounts:
- name: webhook-cert
mountPath: /usr/local/certificates/
readOnly: true
resources:
requests:
cpu: 100m
memory: 90Mi
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
hostNetwork: true
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
部署它,然后设置您的入口 资源 以找到您的控制器。
类似于:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-api-ingress
annotations:
kubernetes.io/ingress.class: nginx
您的关键测试是:
- 我的入口在我的裸机实现中是否有专用节点?
- 如果我在入口节点上访问端口 80,是否会得到与访问 NodePort 相同的结果? (假设 NodePort 是 31207 - 我在入口节点上访问端口 80 是否与在任何节点上访问端口 31207 得到相同的结果?)
最后说明:Ingress 在过去几年发生了很大变化,教程经常提供未通过验证的示例 - 如果此答案已过时,请随时对此答案发表评论。
另外,有些引用会随便说“只是更新部署!” - 他们所指的部署是 Ingress Controller 的部署,而不是您的 pod 部署或类似的部署。
在研究一个 Stack Overflow
情况
我想 运行 hostNetwork
上的 Ingress 控制器(用于开发目的)。到目前为止我学到的是我可以用这样的配置文件创建一个 Ingress 控制器:
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
web
是什么并不重要,只是它是我集群中的一项服务 运行。
在我上面链接的问题中,我被指示“安装 nginx 入口控制器并在 deployment.yaml 中使用 hostNetwork: true”。
我还没有为这个项目创建 deployment.yaml,但我的理解是它用于定义 Pods,以及我希望那些 pods 如何随副本集扩展.
问题
部署是否仅用于定义 Pods(正如我目前的理解),还是我也可以在其中包含我的 service/ingress?无论哪种情况,我应该在哪里定义 hostNetwork: true
指令? (注意:所有这些的目的是打开端口 80 并将其指向我的 Ingress 控制器,所以我只想在 Pods 上设置 hostNetwork: true
似乎不正确他们自己。)
安装 nginx 入口控制器后,命名空间 ingress-nginx
中应该有一个部署 ingress-nginx-controller
。您需要修改部署。您可以使用
kubectl edit deploy ingress-nginx-controller -n ingress-nginx
并在 pod 规范部分添加 hostNetwork: true
...
spec:
hostNetwork: true
containers:
- name: controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0
...
这并不明显。 Ingress 资源控制器使用 .yaml 部署(例如 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml)
这个 yaml 中有很多东西 - 一个资源是部署。如果像我一样,您要部署到裸机专用 LAN 环境中,则可以将 hostNetwork 设置为 true。所以 - wget 它(wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml),并修改它以设置 Deployment 规范的模板规范,以便 hostNetwork: true - 类似于(向下滚动到末尾):
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.6
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.0.4
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
containers:
- name: controller
image: k8s.gcr.io/ingress-nginx/controller:v1.0.4@sha256:545cff00370f28363dad31e3b59a94ba377854d3a11f18988f5f9e56841ef9ef
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LD_PRELOAD
value: /usr/local/lib/libmimalloc.so
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
- name: webhook
containerPort: 8443
protocol: TCP
volumeMounts:
- name: webhook-cert
mountPath: /usr/local/certificates/
readOnly: true
resources:
requests:
cpu: 100m
memory: 90Mi
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
hostNetwork: true
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
部署它,然后设置您的入口 资源 以找到您的控制器。
类似于:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-api-ingress
annotations:
kubernetes.io/ingress.class: nginx
您的关键测试是:
- 我的入口在我的裸机实现中是否有专用节点?
- 如果我在入口节点上访问端口 80,是否会得到与访问 NodePort 相同的结果? (假设 NodePort 是 31207 - 我在入口节点上访问端口 80 是否与在任何节点上访问端口 31207 得到相同的结果?)
最后说明:Ingress 在过去几年发生了很大变化,教程经常提供未通过验证的示例 - 如果此答案已过时,请随时对此答案发表评论。
另外,有些引用会随便说“只是更新部署!” - 他们所指的部署是 Ingress Controller 的部署,而不是您的 pod 部署或类似的部署。