Cloudify 学习(五):通过Cloudify的蓝图创建一个deployment, 并通过k8s的NodePort暴露服务

版权声明:本文为博主原创文章,可以转载分享,希望大家相互学习,共同进步 https://blog.csdn.net/shenhonglei1234/article/details/84971771

Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

  • Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress

NodePort、LoadBalancer和Ingress都是将集群外部流量导入到集群内的方式。

  1. ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务。集群外部无法访问它
#Port:
k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。
mysql容器暴露了3306端口(参考DockerFile),集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort
  1. 如果从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. 完成!

参考资料: http://blog.51cto.com/newfly/2060587

猜你喜欢

转载自blog.csdn.net/shenhonglei1234/article/details/84971771