[英]Kubernetes Nginx Ingress Controller on NodePort
我正在由 RKE 管理的 Kubernetes 集群上部署基於 nginx 的入口 controller。 (我也直接嘗試過沒有 RKE)。
在這兩種情況下,它都嘗試使用/綁定到主機上的Ports 80
和443
,但它失敗了,因為在所有服務帳戶的 pod security policy
中我不允許主機端口。
事實上,我不需要直接在主機上訪問入口,但我想從外部LoadBalancer
訪問ingress controller
作為NodePort
上的Service
。
有沒有辦法部署Nginx ingress controller
不使用任何主機端口。
通過禁用 hostNetwork 來完成,並刪除不必要的權限和功能:
C02W84XMHTD5:Downloads iahmad$ kubectl get deployments -n ingress-nginx -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
name: nginx-ingress-controller
namespace: ingress-nginx
resourceVersion: "68427"
selfLink: /apis/extensions/v1beta1/namespaces/ingress-nginx/deployments/nginx-ingress-controller
uid: 0b92b556-12fa-11ea-9d82-08002762a3c5
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
creationTimestamp: null
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
containers:
- args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
name: nginx-ingress-controller
ports:
- containerPort: 80
name: http
protocol: TCP
- containerPort: 443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
resources: {}
securityContext:
runAsUser: 33
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: nginx-ingress-serviceaccount
serviceAccountName: nginx-ingress-serviceaccount
terminationGracePeriodSeconds: 300
status:
availableReplicas: 1
conditions:
- lastTransitionTime: 2019-11-29T22:46:59Z
lastUpdateTime: 2019-11-29T22:46:59Z
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: 2019-11-29T22:46:13Z
lastUpdateTime: 2019-11-29T22:46:59Z
message: ReplicaSet "nginx-ingress-controller-84758fb96c" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1
kind: List
metadata:
resourceVersion: ""
selfLink: ""
然后創建指向入口 controller 端口的節點端口服務:
C02W84XMHTD5:Downloads iahmad$ kubectl get svc -n ingress-nginx -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
name: ingress-nginx
namespace: ingress-nginx
resourceVersion: "68063"
selfLink: /api/v1/namespaces/ingress-nginx/services/ingress-nginx
uid: 7aa425a4-12f9-11ea-9d82-08002762a3c5
spec:
clusterIP: 10.97.110.93
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 30864
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 30716
port: 443
protocol: TCP
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
C02W84XMHTD5:Downloads iahmad$
在有關NodePort的文檔中,您可以發現該類型可以分配范圍為 30000-32767 的端口。 但是,有一種解決方法。 如果您將添加一個帶有請求范圍的特殊標志--service-node-port-range
,則准許 controller 允許您使用端口 80 和 443 創建 NodePort。
您將需要 go 到/etc/kubernetes/manifests/
,使用 sudo 編輯kube-apiserver.yaml
並添加條目- --service-node-port-range=1-32767
。 之后,您需要保存它。
現在您需要創建service
。 為此,您需要編輯此 yaml並在端口中將node port
添加到spec.ports
前:
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
后:
ports:
- name: http
nodePort: 80
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 443
port: 443
protocol: TCP
targetPort: 443
在這些更改之后,您可以在/etc/kubernetes/manifests/中再次編輯kube-apiserver.yaml
並在- --service-node-port-range
的同一行中使用#
對其進行注釋。
然后就可以curl這個NodePort
地址和Node
地址。
編輯:澄清后
Ingress 可以通過兩種方式部署。 第一個是將Nginx
部署為Deamonset ,這需要配置文件中的hostPort
。 但是還有另一種選擇,您可以將Nginx
部署為Deployment
。
NodeIP 和已知端口:DaemonSet 中的 Pod 可以使用 hostPort,以便通過節點 IP 訪問 Pod。 客戶端以某種方式知道節點 IP 列表,並且按照慣例知道端口。
但是在頁面底部,您可以找到:
DaemonSet 與 Deployment 類似,它們都創建 Pod,並且這些 Pod 具有預期不會終止的進程(例如 web 服務器、存儲服務器)。
將 Deployment 用於無狀態服務,例如前端,其中擴展和縮減副本數量和推出更新比准確控制 Pod 運行在哪個主機上更重要。 當一個 Pod 的副本總是在所有或某些主機上運行很重要,並且當它需要在其他 Pod 之前啟動時,使用 DaemonSet。
您需要將Ingress
部署為Deployment
而不是Deamonset
。
Nginx 部署示例可在此處找到。 由於部署不需要hostPort
,您將能夠在沒有此參數的情況下創建 pod。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.