0%

K8s安装Ingress

1. 拉取镜像

由于无法访问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

2. 使用Helm部署Nginx Ingress

为了便于将集群中的服务暴露到集群外部,需要使用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

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

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

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

查看报错信息

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

命令解释:kubectl describe pod -n

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

发现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

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

3. 使用Helm部署dashboard

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

获取登录token

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

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

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登录。

3.1 登录方式

可以看到有两种登录方式: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的权限,来保证集群安全

-------------    本文结束  感谢您的阅读    -------------