UDN-企业互联网技术人气社区

板块导航

浏览  : 1720
回复  : 0

[教程技巧] 从swarm到kubernetes Docker容器云实践

[复制链接]
genie1003的头像 楼主
发表于 2016-6-23 10:38:28 | 显示全部楼层 |阅读模式
本帖最后由 genie1003 于 2016-6-23 10:50 编辑

  kubernetes 与swarm 比较

  优点

  • 复制集与健康维护
  • 服务自发现与负载均衡
  • 灰度升级
  • 垃圾回收 自动回收失效镜像与容器
  • 与容器引擎解耦 不仅仅支持Docker容器
  • 用户认证与资源隔离

  缺点

  • 大而全意味着 复杂度较高 从部署到使用都比swarm 复杂的多
  • 相对而已swarm比较轻量级 而且跟Docker引擎配合的更好
  • 从精神上我是更支持swarm 奈何现在功能太欠缺
  • 几天前发布了一个 SwarmKit的管理功能 功能多了不少
  • 待其完善以后可以重回swarm的怀抱

  k8s 安装过程

  测试环境 阿里云 ubuntu 14.04

  自动方式

  会自动下载安装文件到各个集群并配置

  直接看官方文档就行了写的很清楚

  要先设置好ssh免密码登录

  注意自动下载的地址都是需要翻墙的

  可以改一下脚本文件里的地址

  http://kubernetes.io/docs/gett ... untu/

  Docker容器方式安装

  还在研究阶段官方支持不好有很多问题

  容器跟平台无关方便升级

  以后的版本可能会更好的支持

  手动方式

  为了了解一下Kube的几个组件

  我们这里重点介绍一下手动安装的方式

  安装节点

  安装 NODE1 NODE2 2个不同主机节点

  下文命令中替换为相应ip地址

  1.下载安装包


  解压并复制采用命令到 /usr/bin 方便操作

  作用解析

  • etcd 为k8s提供存储功能和强一致性保证
  • flannd 打通容器间网络可实现容器跨主机互连

  2.启动etcd
  1. node1
  2. etcd -name k8s-etcd0 -initial-advertise-peer-urls http://NODE1:2380 -listen-peer-urls http://NODE1:2380 \

  3. -listen-client-urls http://NODE1:2379,http://127.0.0.1:2379 -advertise-client-urls http://NODE1:2379 \

  4. -discovery https://discovery.etcd.io/8a5ff5c9ca76877c2efd7ba3c589a110 --data-dir /mnt/k8s/flanneldata

  5. node2
  6. etcd -name k8s-etcd1 -initial-advertise-peer-urls http://NODE2:2380 -listen-peer-urls http://NODE2:2380 \

  7. -listen-client-urls http://NODE2:2379,http://127.0.0.1:2379 -advertise-client-urls http://NODE2:2379 \

  8. -discovery https://discovery.etcd.io/8a5ff5c9ca76877c2efd7ba3c589a110   --data-dir /mnt/k8s/flanneldata
复制代码

  etcd 也可以用Docker 容器启动更方便一点

  然后设置一下打通的内网网段范围
  1. etcdctl set /coreos.com/network/config '{ "Network": "172.17.0.0/16" }'
复制代码

  3.启动flannel
  1. ```
  2. setsid flanneld >> /mnt/k8s/logs/flanneld.log 2>&1

  3. mk-Docker-opts.sh -i
  4. source /run/flannel/subnet.env
  5. rm /var/run/Docker.pid
  6. ifconfig Docker0 ${FLANNEL_SUBNET}
  7. ```
复制代码

  重启Docker
  1. service Docker restart
复制代码

  4.启动 k8s master

  以一台主机为master
  1. setsid ./kube-APIserver --address=0.0.0.0  --insecure-port=8080 --service-cluster-ip-range='192.168.0.0/16'  --log_dir=/mnt/k8s/logs/kube --kubelet_port=10250 --v=0 --logtostderr=false --etcd_servers=http://NODE1:2379 --allow_privileged=false  >> /mnt/k8s/logs/kube-apiserver.log 2>&1

  2. setsid ./kube-controller-manager  --v=0 --logtostderr=false --log_dir=/mnt/k8s/logs/kube --master=127.0.0.1:8080 >> /mnt/k8s/logs/kube-controller-manager 2>&1

  3. setsid ./kube-scheduler  --master='127.0.0.1:8080' --v=0  --log_dir=/mnt/k8s/logs/kube  >> /mnt/k8s/logs/kube-scheduler.log 2>&1
复制代码

  5.启动 k8s 子节点
  1. node  1
  2. setsid ./kube-proxy  --logtostderr=false --v=0 --master=http://NODE1:8080   >> /mnt/k8s/logs/kube-proxy.log 2>&1

  3. setsid ./kubelet  --logtostderr=false --v=0 --allow-privileged=false  --log_dir=/mnt/k8s/logs/kube  --address=0.0.0.0  --port=10250  --hostname_override=NODE1  --api_servers=http://NODE1:8080   >> /mnt/k8s/logs/kube-kubelet.log 2>&1 &

  4. node 2
  5. setsid ./kube-proxy  --logtostderr=false --v=0 --master=http://NODE1:8080   >> /mnt/k8s/logs/kube-proxy.log 2>&1

  6. setsid ./kubelet  --logtostderr=false --v=0 --allow-privileged=false  --log_dir=/mnt/k8s/logs/kube  --address=0.0.0.0  --port=10250  --hostname_override=121.40.84.254 --api_servers=http://NODE1:8080   >> /mnt/k8s/logs/kube-kubelet.log 2>&1 &
复制代码

  测试一下
  1. kubectl run my-nginx --image=nginx --replicas=2 --port=800 --expose --service-overrides='{ "spec": { "type": "NodePort" } }'

  2. kubectl get po  //查看是否正常启动
复制代码

  **坑 **

  pause gcr.io 被墙
  1. image pull failed for gcr.io/google_containers/pause:2.0
复制代码

  使用Docker hub的镜像代替
  1. Docker pull kubernetes/pause
  2. Docker tag   kubernetes/pause gcr.io/google_containers/pause:2.0
复制代码

  K8s 核心概念简介

  pod

  • k8s 中创建的最小部署单元就是pod
  • 而容器是运行在pod里面的
  • pod可以运行多个容器
  • pod内的容器可以共享网络和存储相互访问
2.png

  **replication controller **

  • 复杂集控制器 对多个pod创建相同的副本运行在不同节点
  • 一般不会创建单独的pod而是与rc配合创建
  • rc控制并管理pod的生命周期维护pod的健康

  service

  • 每个容器重新运行后的ip地址都不是固定的
  • 所以要有一个服务方向和负载均衡来处理
  • service就可以实现这个需求
  • service创建后可以暴露一个固定的端口
  • 与相应的pod 进行绑定

  K8s 核心组件简介
1.jpg

  apiserver

  • 提供对外的REST API服务 运行在 master节点
  • 对指令进行验证后 修改etcd的存储数据

  shcheduler

  • 调度器运行在master节点
  • 通过apiserver 定时监控数据变化
  • 运行pod时通过自身调度算法选出可运行的节点

  controller-manager

  控制管理器运行在master节点

  分别几大管理器定时运行 分别为

  1)replication controller 管理器

  管理并保存所有的rc的的状态

  2)service Endpoint 管理器

  对service 绑定的pod 进行实时更新操作

  对状态失败的pod进行解绑

  3)Node controller 管理器

  定时对集群的节点健康检查与监控

  4)资源配额管理器

  追踪集群资源使用情况

  kuctrl (子节点)

  • 管理维护当前子节点的所有容器
  • 如同步创建新容器 回收镜像垃圾等

  kube-proxy (子节点)

  • 对客户端请求进行负载均衡并分配到service后端的pod
  • 是service的具体实现保证了ip的动态变化
  • proxy 通过修改iptable 实现路由转发

1.jpg

  工作流程
1.jpg

  DNS 插件安装

  使用ip地址方式不太容易记忆

  集群内可以使用dns绑定ip并自动更新维护

  安装方式很简单 调用一下脚本就可以了
  1. cd cluster/ubuntu
  2. KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh
复制代码

  问题是镜像地址会被墙 需要修改一下脚本镜像地址

  实践一下

  下面我们来实践一下 写个helloworld 运行一下

  步骤为编写yaml文件--》》编写自动部署jenkins脚本 --》》push git仓库自动部署

  首先要部署Docker-jenkins 环境还没有部署的可以参考我上篇blog -》这里

  首先创建一个Docker-hello-world-rc.yaml 一个rc和 pod
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: test-rc
  5. spec:
  6. replicas: 2
  7. selector:
  8. name: test
  9. version: VERSION
  10. template:
  11. metadata:
  12.   labels:
  13.     name: test
  14.     version: VERSION
  15. spec:
  16.   containers:
  17.     - name: test
  18.       image: IMAGE
  19.       env:
  20.        - name: "JAVA_OPTS"
  21.          value: "-Duser.timezone=GMT+8"
  22.       ports:
  23.         - containerPort: 8080
复制代码

  再创建 Docker-hello-world-svc.yaml 对外暴露服务
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: test-svc
  5. spec:
  6. ports:
  7. - port: 20000
  8.   targetPort: 8080
  9.   protocol: TCP
  10. type: NodePort
  11. selector:
  12. name: test
复制代码

  在编写一下jenkins 的脚本
  1. #!/bin/bash
  2. build in jenkins

  3. REG_URL= xx 你的Docker 仓库 地址
  4. KUBE_MASTER=  xx  k8s master api service 地址

  5. RC_FILE=$WORKSPACE/$JOB_NAME-rc.yaml
  6. SVC_FILE=$WORKSPACE/$JOB_NAME-svc.yaml

  7. TAG=$REG_URL/$JOB_NAME:`date +%y%m%d-%H-%M`

  8. Docker run --rm --name mvn  -v /mnt/maven:/root/.m2   \
  9. -v /mnt/jenkins_home/workspace/$JOB_NAME:/usr/src/mvn -w /usr/src/mvn/ \
  10. maven:3.3.3-jdk-8 mvn clean install -Dmaven.test.skip=true

  11. if [ $? -eq 0 ]; then
  12. echo "maven install succ"
  13. else
  14. echo "maven install fail exit"
  15. exit 1
  16. fi

  17. Docker build -t  $TAG  $WORKSPACE/.

  18. Docker push   $TAG

  19. Docker rmi $TAG

  20. function kube(){

  21. sed -i "s%IMAGE%$TAG%g" $RC_FILE
  22. sed -i "s%VERSION%$VERSION%g" $RC_FILE

  23. KUBEDNS=`eval "kubectl -s $KUBE_MASTER  get svc | grep $JOB_NAME-svc | cat"`

  24. if [ ! "$KUBEDNS" ]; then
  25. echo "create rc and svc "
  26. kubectl -s $KUBE_MASTER   create  -f $RC_FILE   
  27. kubectl -s $KUBE_MASTER   create  -f $SVC_FILE  
  28. else
  29. echo "start rolling-update"
  30. #一般只更新镜像
  31. kubectl -s $KUBE_MASTER   rolling-update  $JOB_NAME-rc  --image=$TAG
  32. fi

  33. }

  34. kube
复制代码

  然后新建个java maven 工程写个hello world 页面就行了

  最后push 到git仓库 等待以后就完事了

  然后我们看看 创建成功后的 service 分配的端口号

  kubectl describe svc 查看分配的Nodeport
2.png

  然后随便找个Node节点ip:Nodeport 就可以访问了就是怎么简单

  代码地址 kube-hello-world分支

原文作者:十二叔 来源:http://dockone.io/article/1435

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部