Cloudify4.5.0和Kubernetes1.13.0进行混合容器编排demo,并通过NodePort暴露服务
Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress
- Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress
NodePort、LoadBalancer和Ingress都是将集群外部流量导入到集群内的方式。
- ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务。集群外部无法访问它
#Port:
k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。
mysql容器暴露了3306端口(参考DockerFile),集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort
- 如果从Internet 没法访问 ClusterIP 服务,所以可以通过 Kubernetes 的 proxy 模式来访问该服务
启动 Kubernetes proxy 模式:
$ kubectl proxy --port=8080
这样你可以通过Kubernetes API,使用如下模式来访问这个服务:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
要访问我们上面定义的服务,你可以使用如下地址:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
3.NodePort
#NodePort:
NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,即在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
eg: 外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePort,nodePort=30001。其他用户就可以通过浏览器http://node:30001访问到该web服务
4.LoadBalancer
#LoadBalancer
LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer[2],它将给你一个单独的 IP 地址,转发所有流量到你的服务
5.Ingress
#Ingress:
Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。
你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力.
Ingress由两部分组成:Ingress Controller 和 Ingress 服务。 ingress控制器有两种:nginx和haproxy
Ingress Contronler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,
按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 Nginx 配置,再写到
Nginx-ingress-control的 Pod 里,这个 Ingress Contronler 的pod里面运行着一个nginx服务,
控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后 reload 一下 使用配置生效.
Cloudify创建Blueprints,并执行创建
1.创建蓝图展示:tomcat8-cst-nodePort
tomcat8-cst-nodePort.yml的内容
tosca_definitions_version: cloudify_dsl_1_3
imports:
- 'http://www.getcloudify.org/spec/cloudify/4.5/types.yaml'
- 'plugin:cloudify-kubernetes-plugin'
inputs:
kubernetes_master_configuration:
default:
apiVersion: v1
kind: Config
preferences: {}
current-context: kubernetes-admin@kubernetes
clusters:
- name: kubernetes
cluster:
certificate-authority-data:
get_secret: kubernetes_cloud_certificate_authority_data
server:
concat:
- 'https://'
- get_secret: kubernetes_cloud_master_ip
- ':'
- get_secret: kubernetes_master_port
contexts:
- name: kubernetes-admin@kubernetes
context:
cluster: kubernetes
user: kubernetes-admin
users:
- name: kubernetes-admin
user:
client-certificate-data:
get_secret: kubernetes-admin_cloud_client_certificate_data
client-key-data:
get_secret: kubernetes-admin_cloud_client_key_data
node_templates:
kubernetes_master:
type: cloudify.kubernetes.nodes.Master
properties:
configuration:
file_content:
get_input: kubernetes_master_configuration
relationships: []
App_deployment:
type: cloudify.kubernetes.resources.Deployment
properties:
definition:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: container-demo
labels:
app: app-name-demo
version: v1
spec:
selector:
matchLabels:
app: app-name-demo
version: v1
replicas: 1
template:
metadata:
labels:
app: app-name-demo
version: v1
spec:
containers:
- name: container-name-demo
image: '10.10.31.205/szy/tomcat8-5-cst:latest'
ports:
- containerPort: 8080
relationships:
- type: cloudify.kubernetes.relationships.managed_by_master
target: kubernetes_master
App_service:
type: cloudify.kubernetes.resources.Service
properties:
definition:
apiVersion: v1
kind: Service
metadata:
name: container-demo
spec:
ports:
- port: 80
targetPort: 8080
nodePort: 30001
selector:
app: app-name-demo
type: NodePort
relationships:
- type: cloudify.kubernetes.relationships.managed_by_master
target: kubernetes_master
有几点需要注意:
1.k8s的配置变量,引用要正确,例如: kubernetes-admin_cloud_client_certificate_data
2.Deployment 的name,重复创建deployment,它名字每次要不一样的,后面会提取成变量。
3.镜像要配置成自己的或者公网的:image: ‘10.10.31.205/szy/tomcat8-5-cst:latest’
4.Tomcat的默认containerPort: 8080
5.App_service的名字,创建一个deployment可以,创建第二个尽是修改名字。
6.port、targetPort、nodePort、type: NodePort的配置,是后面访问服务的关键。
根据Cloudify的Blueprints,创建deployment
1.选择刚才自己创建的蓝图:tomcat8-cst-nodePort
2.Deploy完成后,我们再执行install的操作
创建成功后,可以在Kubernetes中的服务中看到,我们刚才创建的服务,并拿到30001端口
通过Kubernetes通过type:NodePort方式,将内部服务暴露,可以直接通过ip+端口 访问:
eg:http://10.10.31.202:30001/
OK. 完成!