K8s安装Nginx Ingress
0.1 1. 拉取镜像
由于无法访问google网络,故拉取相应的镜像一定不会成功。
说明:
- 本文采用的拉取镜像方法是通过docker hub拉取镜像到本地,最后把镜像tag成k8s镜像的方式
- 本文所有镜像的拉取都是通过这种方式完成的
比如:
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
0.2 2. 使用Helm部署Nginx Ingress
为了便于将集群中的服务暴露到集群外部,需要使用Ingress。接下来使用Helm将Nginx Ingress部署到Kubernetes上。 Nginx Ingress Controller被部署在Kubernetes的边缘节点上.
我们将master(192.168.0.7)做为边缘节点,打上Label:
kubectl label node k8s-master node-role.kubernetes.io/edge=
kubectl get node
stable/nginx-ingress chart
的值文件ingress-nginx.yaml
如下:
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使用宿主机网络。
helm repo update
helm install stable/nginx-ingress \
-n nginx-ingress \
--namespace ingress-nginx \
-f ingress-nginx.yaml
kubectl get pod -n ingress-nginx -o wide
拉取镜像报错(所有来自k8s.gcr.io
镜像都无法拉取)
查看报错信息
kubectl describe pod nginx-ingress-default-backend-7b8b45bd49-zsfzm -n ingress-nginx
命令解释:kubectl describe pod
通过命令kubectl get pod --all-namespaces
获取上述信息
发现nginx-ingress的容器状态是ContainersCreating/ImagePullBackOff,则需要手动下载镜像
通过从docker hub拉取镜像到本地,最后把镜像tag成k8s镜像的方式
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,则部署完成。
0.3 3. 使用Helm部署dashboard
kubernetes-dashboard.yaml
文件如下:
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
helm install stable/kubernetes-dashboard \
-n kubernetes-dashboard \
--namespace kube-system \
-f kubernetes-dashboard.yaml
获取登录token
kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubectl describe -n kube-system secret/kubernetes-dashboard-token-sph9l
镜像拉取失败,原因一样,同理处理问题
kubectl describe pod kubernetes-dashboard-848b8dd798-dlcfn -n kube-system
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登录。
0.3.1 3.1 登录方式
可以看到有两种登录方式:kubeconfig文件、token令牌。 要想登录,得先有账号 k8s集群中,账号分为两种:UserAccount(现实中的人)、ServiceAccount(集群内的客户端) 由于dashboard在集群中是以Pod方式运行提供的服务,所以要使用ServiceAccount访问,简称sa 然而并不是随随便便找个账号就能登录,我们对账号还要设置访问控制,哪些资源允许什么样的操作。 这就用到RBAC(基于角色的访问控制)
首先创建一个sa
kubectl create serviceaccount mysa -n default
创建rolebinding\clusterrolebinding
,然后将此sa绑定至集群中存在的或自定义的role或clusterrole,绑定哪个role\clusterrole
,sa就会具有此role\clusterrole
对应的权限
kubectl create clusterrolebinding dashboard-admin --clusterrole=admin --serviceaccount=default:mysa
查看sa的secret
kubectl get secret
获取tocken
kubectl describe secret mysa-token-92bvn
将secret中的token使用base64方式进行解码,然后使用变量引用
DASH_TOCKEN=$(kubectl get secret mysa-token-92bvn -o jsonpath={.data.token}|base64 -d)
创建一个集群,将信息输出到/root/dashbord-admin.conf
kubectl config set-cluster dashboard-UI --server=192.168.0.50:6443 --kubeconfig=/root/dashbord-admin.conf
创建一个集群用户,并引用sa的token,并输出到/root/dashbord-admin.conf
kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/root/dashbord-admin.conf
创建一个上下文,指定集群名、集群用户名,并输出到/root/dashbord-admin.conf
kubectl config set-context dashboard-admin@dashboard-UI --cluster=dashboard-UI --user=dashboard-admin --kubeconfig=/root/dashbord-admin.conf
设置集群中当前使用的用户,并输出到/root/dashbord-admin.conf
kubectl config use-context dashboard-admin@dashboard-UI --kubeconfig=/root/dashbord-admin.conf
生成的dashbord-admin.conf
即可用于登录dashboard
可以将此文件复制到其他主机,这样其他主机也可以登录
不过,不管是刚用到token登录或kubeconfig文件登录,设置的权限是整个集群中最高的管理员的权限,切记当心泄露
生产环境中,最好将sa绑定到自定义权限的role或者cluster,可以降低role和cluster的权限,来保证集群安全