K8s安装Nginx Ingress

警告
本文最后更新于 2022-07-01,文中内容可能已过时。

摘要

由于无法访问google网络,故拉取相应的镜像一定不会成功。

说明:

  1. 本文采用的拉取镜像方法是通过docker hub拉取镜像到本地,最后把镜像tag成k8s镜像的方式
  2. 本文所有镜像的拉取都是通过这种方式完成的

比如:

1
2
3
4
5
docker pull k8s.gcr.io/defaultbackend-amd64:1.5
# 使用下面命令拉取
docker pull googlecontainer/defaultbackend-amd64:1.5
# 打TAG
docker tag googlecontainer/defaultbackend-amd64:1.5 k8s.gcr.io/defaultbackend-amd64:1.5

为了便于将集群中的服务暴露到集群外部,需要使用Ingress。接下来使用Helm将Nginx Ingress部署到Kubernetes上。 Nginx Ingress Controller被部署在Kubernetes的边缘节点上.

我们将master(192.168.0.7)做为边缘节点,打上Label:

1
2
kubectl label node k8s-master node-role.kubernetes.io/edge=
kubectl get node

https://img.bwcxtech.com/img/20200928162907.png

stable/nginx-ingress chart的值文件ingress-nginx.yaml如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
controller:
  replicaCount: 1
  hostNetwork: true
  nodeSelector:
    node-role.kubernetes.io/edge: ''
  affinity:
    podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - nginx-ingress
            - key: component
              operator: In
              values:
              - controller
          topologyKey: kubernetes.io/hostname
  tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: PreferNoSchedule
defaultBackend:
  nodeSelector:
    node-role.kubernetes.io/edge: ''
  tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: PreferNoSchedule

nginx ingress controller的副本数replicaCount为1,将被调度到master这个边缘节点上。这里并没有指定nginx ingress controller service的externalIPs,而是通过hostNetwork: true设置nginx ingress controller使用宿主机网络。

1
2
3
4
5
helm repo update
helm install stable/nginx-ingress \
-n nginx-ingress \
--namespace ingress-nginx  \
-f ingress-nginx.yaml

https://img.bwcxtech.com/img/20200928162912.png

1
kubectl get pod -n ingress-nginx -o wide

拉取镜像报错(所有来自k8s.gcr.io镜像都无法拉取)

https://img.bwcxtech.com/img/20200928163021.png

查看报错信息

1
kubectl describe pod nginx-ingress-default-backend-7b8b45bd49-zsfzm -n ingress-nginx

命令解释:kubectl describe pod -n

通过命令kubectl get pod --all-namespaces获取上述信息

https://img.bwcxtech.com/img/20200928163028.png

发现nginx-ingress的容器状态是ContainersCreating/ImagePullBackOff,则需要手动下载镜像

通过从docker hub拉取镜像到本地,最后把镜像tag成k8s镜像的方式

1
2
docker pull googlecontainer/defaultbackend-amd64:1.1
docker tag googlecontainer/defaultbackend-amd64:1.1 k8s.gcr.io/defaultbackend-amd64:1.5

https://img.bwcxtech.com/img/20200928163035.png

如果访问http://192.168.0.7返回default backend,则部署完成。

kubernetes-dashboard.yaml文件如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
image:
  repository: k8s.gcr.io/kubernetes-dashboard-amd64
  tag: v1.10.1
ingress:
  enabled: true
  hosts: 
    - k8s.frognew.com
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  tls:
    - secretName: frognew-com-tls-secret
      hosts:
      - k8s.frognew.com
nodeSelector:
    node-role.kubernetes.io/edge: ''
tolerations:
    - key: node-role.kubernetes.io/master
      operator: Exists
      effect: NoSchedule
    - key: node-role.kubernetes.io/master
      operator: Exists
      effect: PreferNoSchedule
rbac:
  clusterAdminRole: true
1
2
3
4
helm install stable/kubernetes-dashboard \
-n kubernetes-dashboard \
--namespace kube-system  \
-f kubernetes-dashboard.yaml

https://img.bwcxtech.com/img/20200928163044.png

获取登录token

1
2
kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubectl describe -n kube-system secret/kubernetes-dashboard-token-sph9l

https://img.bwcxtech.com/img/20200928163052.png

镜像拉取失败,原因一样,同理处理问题

1
kubectl describe pod kubernetes-dashboard-848b8dd798-dlcfn -n kube-system
1
2
docker pull siriuszg/kubernetes-dashboard-amd64:v1.10.1
docker tag siriuszg/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

使用域名访问k8s.frognew.com,客户端需要修改hosts,有dns服务器直接在dns服务器添加解析。

在dashboard的登录窗口使用上面的token登录。

https://img.bwcxtech.com/img/20200928163117.png

https://img.bwcxtech.com/img/20200928163124.png

可以看到有两种登录方式:kubeconfig文件、token令牌。 要想登录,得先有账号 k8s集群中,账号分为两种:UserAccount(现实中的人)、ServiceAccount(集群内的客户端) 由于dashboard在集群中是以Pod方式运行提供的服务,所以要使用ServiceAccount访问,简称sa 然而并不是随随便便找个账号就能登录,我们对账号还要设置访问控制,哪些资源允许什么样的操作。 这就用到RBAC(基于角色的访问控制)

首先创建一个sa

1
kubectl create serviceaccount mysa -n default

创建rolebinding\clusterrolebinding,然后将此sa绑定至集群中存在的或自定义的role或clusterrole,绑定哪个role\clusterrole,sa就会具有此role\clusterrole对应的权限

1
kubectl create clusterrolebinding dashboard-admin --clusterrole=admin --serviceaccount=default:mysa

查看sa的secret

1
kubectl get secret

获取tocken

1
kubectl describe secret mysa-token-92bvn

将secret中的token使用base64方式进行解码,然后使用变量引用

1
DASH_TOCKEN=$(kubectl get secret mysa-token-92bvn -o jsonpath={.data.token}|base64 -d)

创建一个集群,将信息输出到/root/dashbord-admin.conf

1
kubectl config set-cluster dashboard-UI --server=192.168.0.50:6443 --kubeconfig=/root/dashbord-admin.conf

创建一个集群用户,并引用sa的token,并输出到/root/dashbord-admin.conf

1
kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/root/dashbord-admin.conf

创建一个上下文,指定集群名、集群用户名,并输出到/root/dashbord-admin.conf

1
kubectl config set-context dashboard-admin@dashboard-UI --cluster=dashboard-UI --user=dashboard-admin --kubeconfig=/root/dashbord-admin.conf

设置集群中当前使用的用户,并输出到/root/dashbord-admin.conf

1
kubectl config use-context dashboard-admin@dashboard-UI --kubeconfig=/root/dashbord-admin.conf

生成的dashbord-admin.conf即可用于登录dashboard 可以将此文件复制到其他主机,这样其他主机也可以登录 不过,不管是刚用到token登录或kubeconfig文件登录,设置的权限是整个集群中最高的管理员的权限,切记当心泄露 生产环境中,最好将sa绑定到自定义权限的role或者cluster,可以降低role和cluster的权限,来保证集群安全