图中所出现的内容,在配置文件中均有体现
html
流量基本的流向图所示,LoadBalancer能够是云服务所提供,也能够是一个Nginx/HAProxy/istio,甚至“它”不存在均可以。前端
糙一点能够直接让IngressService拿外网IP提供服务,本文就这么干的!vue
术语 | 做用 | 关联 |
---|---|---|
IngressController | Ingress控制器,内置的是ingress-nginx, 能够认为是真正运行流量分发的地方。k8s系统 自带的是Nginx |
Ingress |
IngressService | 就是个Service,但它是IngressController的前端 | IngressController |
Ingress | 至关于Nginx的主机配置文件 | IngressController |
ingress annotations | 经过注解详细配置主机 | Github Ingress Doc |
准备ingress-nginx的镜像地址nginx
registry.cn-beijing.aliyuncs.com/smokelee/nginx-ingress-controller:0.30.0
下载部署用的yamlgit
地址会由于项目不停的开发而变化,到Ingress-Nginx Github去看一眼会拿到新连接github
$wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
编辑mandatory.yamlweb
镜像地址调整为registry.cn-beijing.aliyuncs.com/smokelee/nginx-ingress-controller:0.30.0
私有仓库有密码的状况,在ingress-nginx的命名空间中加一个secret,并在yaml中增长 imagePullSecrets配置docker
准备上面须要的Service来公布服务api
kind: Service apiVersion: v1 metadata: name: ingress-nginx namespace: ingress-nginx labels: <===这两个Selector会被ingress-nginx-controller拿到,并读取数据。找不到这个Service,ingress-nginx会不停输出错误。但状态时Running和Ready app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx externalIPs: 这里直接指定IP了,条件容许应该用LB。NodePort也行,我嫌麻烦 - 192.168.56.5 ports: - name: http port: 80 protocol: TCP targetPort: http - name: https port: 443 protocol: TCP targetPort: https
坑!bash
就算不部署上面的Service,ingress-controller安装完成后也会提示Running/Ready。而且只有到Node节点打印log才发现,它须要一个Service。
kubectl get all -n ingress-nginx NAME READY STATUS RESTARTS AGE pod/nginx-ingress-controller-648f9697ff-rwxxr 1/1 Running 0 24h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-ingress-controller 1/1 1 1 24h NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-ingress-controller-648f9697ff 1 1 1 24h
用Vue脚手架搭建一个vue并编译
编译完成后目录中有一个dist目录
编写Docker文件
以为上两步麻烦,直接弄个目录,写一个html随便写点啥都行!和Dockerfile在一个目录便可。换成COPY index.html .就行啦
FROM nginx:latest ENV NODE_ENV production WORKDIR /usr/share/nginx/html COPY dist .
编译并推送到仓库
$docker build -t <镜像地址>:latest $docker push <镜像地址>:latest 这里假设地址是:registry.cn-beijing.aliyuncs.com/smokelee/app/vue-demo:latest
编写APP的部署文件
apiVersion: apps/v1 kind: Deployment metadata: name: vue-demo-deployment spec: selector: matchLabels: app: vue-demo-pod template: metadata: labels: app: vue-demo-pod spec: imagePullSecrets: - name: registry-secret-smokelee.com containers: - name: vue-demo image: registry.i.smokelee.com/app/vue-demo:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: web protocol: TCP --- apiVersion: v1 kind: Service metadata: name: vue-demo-svc labels: app: vue-demo-svc spec: selector: app: vue-demo-pod ports: - name: web port: 80 targetPort: web
编写app的Ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: simple-nginx-example annotations: nginx.ingress.kubernetes.io/rewrite-target: / 关于ingress-nginx的注解,在1.3中的表格有描述 spec: rules: - host: vue.smokelee.com 定义域名 http: paths: - path: / backend: serviceName: vue-demo-svc 内部DNS找到主机,对应见app的部署内容 servicePort: 80
kubectl 建立上述两个资源
建立完成后,经过命令找到ingress-nginx service的IP地址,并在/etc/hosts中增长记录
kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx ClusterIP 10.254.7.143 192.168.56.5 80/TCP,443/TCP 15s
经过curl来测试访问结果
$curl http://vue.smokelee.com 返回HTML
去看看2.2.7的注解吧,比较粗的发布都能作到!网上有阿里云的示例,并不适用默认的nginx-ingress-controller,人家本身开发了一些。