Skip to content

wdxxs2z/ops-kubops

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 

Repository files navigation

ops-kubops

在PCF环境中部署和管理kubernetes集群

前序

Bosh是新一代分布式部署平台,在其上Bosh通过CPI将我们需要部署的软件自动分发部署到IaaS平台上。目前bosh已经来到2.0,最近官方重写了bosh客户端,基本能做到本地打包到处复用,云上部署,云上调试。Bosh提供了通用的stemcell将操作系统封装,本质上还是希望运维人员能在其之上快速部署基础组件,淡化OS概念。

目前已经有很多厂商在其上做了自动化封装,最近比较火的kubo也是如此,kubo是google和pivotal工程师一起协作开源的自动化项目,目的在于将kubernetes直接部署到谷歌云的Bosh环境里,后续可能在其上封装kubernetes service broker,不过目前kube有个孵化项目service-catalog,意义在于将应用和服务分离,形成一个open service broker api业界标准。

部署kubo之前,看下官方的架构:

kubo deployment

从官方解释看,此项目还只是一个合作孵化项目,route-api的功能还没有释放出来,只是在其上注册了tcp router接管了kubernetes api访问终端,由于内部使用TLS证书,所以不同通过kubernetes api终端url直接访问dashboard ui,对于kubectl的操作也相对复杂一些。至于一些周边功能,如日志,监控等还需要自己集成,就不要直接封装到kubo里了,另外打出release,组合部署。

部署步骤:

  1. 准备uaac客户端,将routing api client注册到uaa认证中心,赋予权限能对route api进行操作
uaac target uaa.example.com
uaac token client get admin -s MyAdminPassword
uaac client add routing_api_client --authorities "routing.routes.write,routing.routes.read,routing.router_groups.read" --authorized_grant_type "client_credentials"
  1. 平台开启tcp route支持,在DNS Server中,将kubernetes.yourdomain指向tcp router

  2. 将制作好的bosh release封装成Ops Manager Zip安装介质,这里可能涉及不止kubo的release

  • 目前项目的开源地址
https://github.com/pivotal-cf-experimental/kubo-release
  1. 将介质上传到PCF上,准备部署

ops manager-upload

  1. 配置kubernetes
  • kubernetes api和kubelet 的密码手动填写,这里不使用平台自动生成策略。
  • 生成TLS访问证书:填写泛域名 如 *.yourDomain,这里指定了kubernetes.yourDomain
  • 填写刚才uaac注册的uaa 的 client id和密码 :routing_api_client ,your client password
  • 如果平台有自己的私有镜像库也可填写自己的镜像库
  • 其它可配置参数目前没有释放,如果需要可以自己定制模板,将参数释放出来
  • 支持多AZ部署

ops manager-opts

  1. kubernetes的主要组件说明
  • etcd:主要存储和管理flannel vxlan网络的配置信息,储存kubernetes的元数据
  • kubernetes: v1.4.6的版本,在定制时,可选择不同版本定制。目前官方正在测试1.6,kubernetes1.6版本较之前版本改动较大,比如在KubeDNS就引入了external dns,方便第三方外部DNS接入
  • docker: v1.11版本,如有特殊情况,可以自行定制
  • nginx: 对kubernetes-dashboard负载
  • kubernetes-api-route-registrar: 将kubernetes api的终端kubernetes.yourDomain:8443注册到tcp router上
    • metron agent:未来可将此组件纳入,接入ELK日志系统
    • grafana: 统一监控界面
  1. 添加errand支持kubernetes system-namespace service
    系统服务在此errand统一部署,如ui,dns,heapster,influxdb等,目前这个版本需要自己封装errand,不支持errand模式(已经提交了issue),所以在官方的基础上,会稍微改变一下部署策略,添加对其的支持。

  2. 配置组件资源列表

ops manager-resource

  1. 使用kubectl操作kubernetes集群
    查看pods
kubectl --kubeconfig=/var/vcap/jobs/kubeconfig/config/kubeconfig --all-namespaces=true get po 

查看所有实例

kubectl --kubeconfig=/var/vcap/jobs/kubeconfig/config/kubeconfig describe svc --all-namespaces=true

部署一个nginx模板nginx

kubectl --kubeconfig=/var/vcap/jobs/kubeconfig/config/kubeconfig create -f /tmp/nginx.yml

通过nodeip:31000访问dashboard

kubo-ui

  1. 部署grafana监控服务,此块服务也可直接放到errand里执行
./kubectl --kubeconfig=/var/vcap/jobs/kubeconfig/config/kcreate -f /tmp/grafana.yml
  • 查看grafana详情

kubo-gs

  • 进入节点查看监控指标.

kubo-ga

  • 集群指标.

kubo-gb

  • pod指标.

kubo-gc

关于powerdns

由于bosh的高度自动化,kubo将kubelet节点名按照spec.id全部自动写入powerdns job: xxxxx-xxxxx-id(hostname) -> kubelet_ip,但是如果我们有自己的dns服务器,目前的做法是将spec.id改为spec.network,这样类似kubectl logs/exec就不会出错了

关于kubernetes的操作

  • 首先下载针对不同平台的kubectl客户端到本地,比如我的是windows,则可以到kubectl-windows去下载

  • 到kube master的虚机上,拷贝kubeconfig的配置属性文件(ca.pem,kubeconfig),将这些文件统一放到windows下的某个目录里

  • 修改kubeconfig文件种ca.pem文件的位置

  • 测试命令如:kubectl --kubeconfig=c:\kube\kubeconfig --all-namespaces=true get po

关于路由注册

  • 目前官方已完成路由发现部分的设计,包括tcp和http都涵盖在内,具体设计如下(个人理解): kubo-gy

  • TCP:可以看出tcp是直接通过route api联合uaa将kubernetes内被打了标签tcp-route-sync的services注册进tcp route,用户可以直接用tcp-route的IP:service_lable_port访问。

  • HTTP:http是通过nats将k8s内被打了标签http-route-sync的services注册进gorouter,用户可以直接用service_lable_hostname加上cf的域名进行访问。

  • CTX:持续对k8s所有namespaces内的services进行扫描

关于Kubernetes的测试用例

  1. Nginx测试用例

nginx比较简单,通过dashboard界面将example/nginx.yml上传上去就行了

apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx
    http-route-sync: nginx  #http 则指定host名 -> gorouter
    #tcp-route-sync: '34567' #tcp 则指定端口 -> tcp router
  name: nginx
spec:
  ports:
    - port: 80
  selector:
    app: nginx
  type: NodePort #必须指定服务端口类型为`nodeport`
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: hub.c.163.com/library/nginx:latest
        ports:
        - containerPort: 80

查看dashboard,观察nginx服务的标签

kubo-gl

查看路由注册组件,观察日志

kubo-gk

直接访问应用域名,一切正常

kubo-gh

查看gorouter路由表

kubo-gf

  1. Grafana监控dashboard

目前平台不提供监控的dashboard,所以需要自己创建,同样将grafana暴露给gorouter,通过界面将example/grafana.yml上传上去就行了

metadata:
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-grafana
    # Add http route sync label to call cloudfoundry route api.
    http-route-sync: grafana
  name: monitoring-grafana
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
  # target the type is nodeport to tell gorouter.
  type: NodePort
  1. Tomcat应用

在label中添加tomcat-example,通过界面将example/tomcat.yml上传上去就行了

apiVersion: v1
kind: Service
metadata:
  labels:
    name: tomcat-example
    http-route-sync: tomcat-example
  name: tomcat-example
spec:
  ports:
    - port: 8080
  selector:
    app: tomcat-example
  type: NodePort
  1. Mysql带持久化存储

举一个TCP路由的例子,mysql的部署复杂一些,需要提前定义pv和pvc,最后将tcp标签暴露给tcp router

1). 创建一个PV,example/local-volume.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-1
  labels:
    type: local
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /tmp/data/pv-1

2). 创建mysql对应的PVC,example/pvc-mysql.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

3). 创建mysql的replication和svc,example/mysql-deployment.yml,需要注意这里在服务里指定的是tcp-route-sync,端口为34569,持久化卷绑定的是/data目录

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
    tcp-route-sync: '34569'

volumeMounts:
- name: mysql-persistent-storage
  mountPath: /data
      
volumes:
- name: mysql-persistent-storage
  persistentVolumeClaim:
    claimName: mysql-pv-claim

4). 通过mysql客户端程序直接访问tcp router的IP,端口34569,用户名admin,密码xxx,就能访问数据库了。

kubo-mysql

后续
  1. 官方会持续集成日志,对接cf的metron agent
  2. 解决定时清理k8s集群长时间不用的images
  3. 集成UAA,完成多租户下的kubernetes namespace的权限管理设计
  4. 提供持久化存储服务

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published