文档章节

F5实现k8s环境下应用自动发布

jellyfishq2807c
 jellyfishq2807c
发布于 2019/04/29 16:27
字数 1242
阅读 180
收藏 0

3 月,跳不动了?>>>

Kubernetes设计角度灵活的利于了clusterip实现了集群内部的服务互访,然而针对面向互联网的应用,需要实现基于集群外部的发布。满足DevOps的趋势,需要实现k8s环境下应用的自动发布。
    
  Container Connector包含f5-k8s-controller和用户定义的“F5资源”。 f5-k8s-controller是一个可以在Kubernetes Pod中运行的Docker容器。 
  “F5资源”是Kubernetes ConfigMap资源,它将编码数据传递给f5-k8s-controller。这些资源告诉f5-k8s-controller:
   •在BIG-IP上配置哪些对象
   •BIG-IP对象所属的Kubernetes服务(分别是ConfigMap中的前端和后端属性)。
     f5-k8s-controller监视Kubernetes中F5资源的创建和修改。当它发现更改时,它会相应地修改BIG-IP。例如,对于F5 virtualServer资源,
   CC-Kubernetes执行以下操作:
   •创建对象以表示指定分区中BIG-IP上的VS;
   •使用Kubernetes分配给服务端口的NodePort为Kubernetes集群中的每个节点创建pool member;
   •监控F5资源和链接的Kubernetes resources for changes并重新配置BIG-IP。
   •然后,BIG-IP在指定的虚拟地址上处理服务的流量,并对集群中的所有节点进行负载平衡。
   •在群集内,分配的NodePort负载均衡到服务的所有Pod。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190429154947986.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEzMDU0MQ==,size_16,color_FFFFFF,t_70)

    下面讲演示通过F5 CC(Container Connector)与F5 BIGIP联动实现业务自动的对外发布。

1. 在BIGIP设备上创建新的partition,命名为kubernetes

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190429155044807.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEzMDU0MQ==,size_16,color_FFFFFF,t_70)
2. 创建serviceaccount

**kubectl create serviceaccount bigip-ctlr -n kube-system**

3. 创建RBAC policy f5-k8s-sample-rbac.yaml,并apply

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: bigip-ctlr-clusterrole
rules:
- apiGroups:
  - ""
  - "extensions"
  resources:
  - nodes
  - services
  - endpoints
  - namespaces
  - ingresses
  - secrets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  - "extensions"
  resources:
  - configmaps
  - events
  - ingresses/status
  verbs:
  - get
  - list
  - watch
  - update
  - create
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: bigip-ctlr-clusterrole-binding
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: bigip-ctlr-clusterrole
subjects:
- kind: ServiceAccount
  name: bigip-ctlr
  namespace: kube-system
  

**kubectl create -f f5-k8s-sample-rbac.yaml**

4. 创建secrect保存admin用户和密码

**kubectl create secret generic bigip-login --namespace kube-system --from-literal=username=admin --from-literal=password=admin**

5. 创建f5-cc-deployment.yaml,并apply

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: k8s-bigip-ctlr-deployment
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      name: k8s-bigip-ctlr
      labels:
        app: k8s-bigip-ctlr
    spec:
      serviceAccountName: bigip-ctlr
      containers:
        - name: k8s-bigip-ctlr
          # replace the version as needed
          image: "f5networks/k8s-bigip-ctlr:1.7.1"
          env:
            - name: BIGIP_USERNAME
              valueFrom:
                secretKeyRef:
                  name: bigip-login
                  key: username
            - name: BIGIP_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: bigip-login
                  key: password
          command: ["/app/bin/k8s-bigip-ctlr"]
          args: [
            "--bigip-username=$(BIGIP_USERNAME)",
            "--bigip-password=$(BIGIP_PASSWORD)",
            "--bigip-url=10.1.10.176",
            "--bigip-partition=kubernetes",
            # The Controller can use local DNS to resolve hostnames;
            # defaults to LOOKUP; can be replaced with custom DNS server IP
            # or left blank (introduced in v1.3.0)
            #"--resolve-ingress-names=LOOKUP",
            #"--pool-member-type=cluster",
            #"--flannel-name=flannel_vxlan"
            # The Controller can access Secrets by default;
            # set to "false" if you only want to use preconfigured
            # BIG-IP SSL profiles
            #"--use-secrets=false",
            # The Controller watches all namespaces by default.
            # To manage a single namespace, or multiple namespaces, provide a
            # single entry for each. For example:
            # "--namespace=test",
            # "--namespace=prod"
            ]
      imagePullSecrets:
        - name: f5-docker-images
        - name: bigip-login

 **kubectl create -f f5-cc-deployment.yaml**

创建完成后通过**kubectl get pod -n kube-system | grep bigip** 命令确认CC状态

kubectl get pod -n kube-system | grep bigip
k8s-bigip-ctlr-deployment-66977b7bc6-x9rbf   1/1     Running   0          41m

使用命令**kubectl logs k8s-bigip-ctlr-deployment-66977b7bc6-x9rbf  -n kube-system**确认CC处于监听状态

kubectl logs k8s-bigip-ctlr-deployment-66977b7bc6-x9rbf -n kube-system
2019/04/29 07:18:46 [INFO] Starting: Version: v1.7.1, BuildInfo: n1279-465125010
2019/04/29 07:18:46 [INFO] ConfigWriter started: 0xc000445a10
2019/04/29 07:18:46 [INFO] Started config driver sub-process at pid: 12
2019/04/29 07:18:46 [INFO] NodePoller (0xc0003b4900) registering new listener: 0x1829650
2019/04/29 07:18:46 [INFO] NodePoller started: (0xc0003b4900)
2019/04/29 07:18:46 [INFO] Watching ConfigMap resources.
2019/04/29 07:18:46 [INFO] Handling ConfigMap resource events.
2019/04/29 07:18:46 [INFO] Registered BigIP Metrics
2019/04/29 07:18:46 [INFO] Wrote 0 Virtual Server and 0 IApp configs
2019/04/29 07:18:47 [INFO] [2019-04-29 07:18:47,333 __main__ INFO] entering inotify loop to watch /tmp/k8s-bigip-ctlr.config215984094/config.json

5. 在k8s上创建应用,共包含三个yaml 文件my-frontend-deployment.yaml,my-frontend-configmap.yaml,my-frontend-service.yaml。

my-frontend-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-frontend
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: my-frontend
    spec:
      containers:
      - image: "chen23/f5-demo-app"
        env:
        - name: F5DEMO_APP
          value: "frontend"
        - name: F5DEMO_BACKEND_URL
          value: "http://my-backend/"
        imagePullPolicy: IfNotPresent
        name: my-frontend
        ports:
        - containerPort: 80
          protocol: TCP

my-frontend-configmap.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: my-frontend
  namespace: default
  labels:
    f5type: virtual-server
data:
  schema: "f5schemadb://bigip-virtual-server_v0.1.7.json"
  data: |-
    {
      "virtualServer": {
        "frontend": {
          "balance": "round-robin",
          "mode": "http",
          "partition": "kubernetes",
          "virtualAddress": {
            "bindAddr": "10.1.10.81",
            "port": 80
          }
        },
        "backend": {
          "serviceName": "my-frontend",
          "servicePort": 80,
          "healthMonitors": [{
          "interval": 30,
          "protocol": "http",
          "send": "HEAD / HTTP/1.0\r\n\r\n",
          "timeout": 91
          }]
        }
      }
    }

my-frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-frontend
  labels:
    run: my-frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  type: NodePort
  selector:
    run: my-frontend
    
**kubectl create -f my-frontend-deployment.yaml
kubectl create -f my-frontend-configmap.yaml
kubectl create -f my-frontend-service.yaml**

创建完成后查看service,该服务监听在31752端口

kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP        125d
my-frontend   NodePort    10.109.185.196   <none>        80:31752/TCP   47m

6. 检查BIGIP上配置,worker node 10.1.1.175的端口31752自动添加到BIGIP配置中。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190429161926940.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEzMDU0MQ==,size_16,color_FFFFFF,t_70)
通过浏览器访问可以打开页面:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190429162122531.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEzMDU0MQ==,size_16,color_FFFFFF,t_70)

© 著作权归作者所有

jellyfishq2807c
粉丝 0
博文 4
码字总数 3920
作品 0
朝阳
私信 提问
加载中

评论(0)

迈入Docker、Kubernetes容器世界的大门

本文通过简单的示例,带领初学者快速迈入Docker、Kubernetes(K8S)容器世界的大门。假设,你已拥有一个K8S集群,否则,可通过minikube或minishift快速搭建一实验环境。 Docker Docker与K8S...

店家小二
2018/12/17
0
0
Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu

本文介绍两个可行的K8s监控方案:Prometheus和Sensu。两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能、定位故障、接收预警。 拓展阅读:Kubernetes监控实践(1)...

宜信技术学院
2019/09/27
507
0
微软Build 2018 开发者大会的解读:Cloud + AI的延续

Microsoft Build 是微软一年一度的面向开发者的最大的会议。今年的微软Build大会主题围绕ACIDD(如下图),(和何导提出的ACID英雄所见略同)整个keynote里,Staya主要focus在AI,IoT方面微软...

c云龙
2018/05/10
0
0
前端领域的 Docker 与 Kubernetes

看完本文希望读者能够了解到,Docker 的基本原理,Kubernetes 是怎么工作的, 对于前端 Kubernetes 有哪些优势与玩法。 Docker 和传统部署方式最大的不同在于,它将不会限制我们使用任何工具...

云音乐前端技术团队
2019/11/27
0
0
Kubernetes与OpenStack融合支撑企业级微服务

EasyStack云架构师钟宇澄 2017年10月21日,七牛云架构师实践日活动于深圳成功举办,本次活动由七牛云、K8S技术社区联合主办,特邀vivo、平安科技共同参与,会议以Kubernetes 技术落地过程中遇...

ra681t58cjxsgckj31
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Linux中一步更改文件夹及其所有子文件夹和文件的权限? [关闭]

问题: I would like to change permissions of a folder and all its sub folders and files in one step (command) in Linux. 我想在Linux中一步(命令)更改文件夹及其所有子文件夹和文件......

javail
33分钟前
13
0
Gradle 6 针对已有的构建如何创建一个构建扫描

有关构建扫描的定义为: 构建扫描(build scan)是一个中心化并且可以共享的构建记录。这个构建记录通常能够告诉在构建中发生了什么并且为什么会发生。 通过应用构建扫描插件到你的项目中,你...

honeymoose
今天
17
0
C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

一、malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free是进行内存释放的库函数。 1、函数原型 #include <stdlib.h> void *malloc( size_t size ); v...

shzwork
今天
17
0
什么是JavaBean? - What is a JavaBean exactly?

问题: I understood, I think, that a "Bean" is a Java class with properties and getters/setters. 我认为,“ Bean”是具有属性和getter / setter的Java类。 As much as I understand,......

技术盛宴
今天
27
0
深圳援鄂最后一批工作人员归来,88万元关爱金发放至85人

中国公益在线3月31日深圳讯 深圳援鄂最后一批工作人员归来......深圳市民政局、深圳市卫健委和深圳市慈善会发起了“深爱战疫天使基金”项目,联合龙华区慈善会和 永贤慈善基金会,进行第二次...

传承天下融媒体中心
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部