最近在学习Kubernetes。
现在要部署Tomcat的SpringBoot项目,基本的部署是这么实现的:

二进制包部署

1.准备CentOS服务器一台
2.安装JDK
3.部署Tomcat
4.部署war包
5.部署Nginx反向代理,对外发布

docker部署

1.准备CentOS服务器,部署docker
2.引入Tomcat,ADD war包,打包
3.docker启动此image
4.部署Nginx反向代理,对外发布

Kubernetes部署

1.引入Tomcat,ADD war包,打包后发布harbor
2.deploy
3.service
4.nginx-ingress对外发布

看起来部署没有差多少,甚至Kubernetes更复杂一点,但是这里面只有Kubernetes做到了高可用与无限扩展,对于我这样的一直都想找最简单的方式去部署项目的人来说再好不过,所以要学习Kubernetes。
那么今天主要是部署Nginx-Ingress。


组件

Nginx-Ingress:基于openresty的反向代理,用于Kubernetes服务发布
Helm:可以理解为Kubernetes的包管理系统,简化部署

1.选择模式

nginx-ingress一般有两种部署方式:
1.Deployment部署,Service使用LoadBalancer
2.DaemonSet部署,Service使用hostPort暴露端口

第一种仅适合在云厂商上使用,本地部署需要使用第二种。

2.节点标签

DaemonSet部署,就是符合的node,每个node都部署一个pod,所以我们需要先选定节点作为ingress的暴露节点,一般高可用就是设定多台ingress节点,然后利用lvs进行发布,倒是个非常不错的模式,所以这里我们暴露2台。

# 添加标签
kubectl label node node01 node=ingress
kubectl lable node node02 node=ingress

# 查看labels
kubectl get nodes --show-labels
NAME          STATUS   ROLES    AGE   VERSION   LABELS
kube-master   Ready    master   9d    v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kube-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01        Ready    <none>   9d    v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,node=ingress
node02        Ready    <none>   8d    v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux,node=ingress
node03        Ready    <none>   8d    v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node03,kubernetes.io/os=linux

3.部署nginx-ingress

目前的nginx-ingress版本是0.25.0,这里指定部署在kube-system这个namespace中,并命名为nginx-ingress,使用daemonset方式部署,仅部署在有node=ingress标签的节点中(这里我们是node01与node02),使用hostport暴露本机端口。
注意拉取镜像的时候需要科学上网

helm install stable/nginx-ingress \
  --namespace kube-system \
  --name nginx-ingress \
  --set controller.kind=DaemonSet \
  --set controller.nodeSelector.node=ingress \
  --set controller.daemonset.useHostPort=true \
  --set controller.service.type=ClusterIP

如果需要删除:

helm delete --purge nginx-ingress

部署完毕查看部署状态:

kubectl get all -n kube-system | grep nginx-ingress

pod/nginx-ingress-controller-9d4nq                   1/1     Running   0          59m
pod/nginx-ingress-controller-p92hw                   1/1     Running   0          59m
pod/nginx-ingress-default-backend-59944969d4-hpzhw   1/1     Running   0          59m

service/nginx-ingress-controller        ClusterIP   10.104.50.24    <none>        80/TCP,443/TCP           59m
service/nginx-ingress-default-backend   ClusterIP   10.100.214.43   <none>        80/TCP                   59m


daemonset.apps/nginx-ingress-controller   2         2         2       2            2           node=ingress                      59m
deployment.apps/nginx-ingress-default-backend   1/1     1            1           59m

replicaset.apps/nginx-ingress-default-backend-59944969d4   1         1         1       59m

可以看到nginx-ingress已经在两个节点上运行了。
如果对node01、node02两个节点做lvs,不在这里讨论了,目前只要使用ingress发布的service都可以修改hosts指向任意一个节点查看。


为什么会有本文章

一开始没搞懂k8s的label,以为只是个字符串标签,其实是属于key-value格式的,导致一开始很傻的以为打标签是用这样的方式:

kubectl label node node01 node-role.kubernetes.io/edge=

其实这样是给这个节点标记role,所以导致后面在helm部署的时候,selector选择为node=ingress根本就没有节点符合去运行pod,因为压根就没有node=edge标签的机器,新接触一套系统肯定有很多坑,慢慢学习吧。


参考资料:使用Nginx Ingress Controller导入外部流量到Kubernetes集群内部 - imroc.io|roc的博客|Cloud Native|Kubernetes|Go|Golang

Last modification:August 9th, 2019 at 02:46 pm