从swarm到kubernetes Docker容器云实践

这篇具有很好参考价值的文章主要介绍了从swarm到kubernetes Docker容器云实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

kubernetes 与swarm 比较

优点

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

缺点

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

k8s 安装过程

测试环境 阿里云 ubuntu 14.04

自动方式

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

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

要先设置好ssh免密码登录

注意自动下载的地址都是需要翻墙的 可以改一下脚本文件里的地址

http://kubernetes.io/docs/getting-started-guides/ubuntu/

Docker容器方式安装

还在研究阶段官方支持不好有很多问题 容器跟平台无关方便升级 以后的版本可能会更好的支持

手动方式

为了了解一下Kube的几个组件 我们这里重点介绍一下手动安装的方式

安装节点

安装 NODE1 NODE2 2个不同主机节点 下文命令中替换为相应ip地址

1.下载安装包 etcd-v2.3.3 flannd-v0.5.5 kubenetes-v1.2.3

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

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

2.启动etcd

 node1 
etcd -name k8s-etcd0 -initial-advertise-peer-urls http://NODE1:2380 -listen-peer-urls http://NODE1:2380 \

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

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

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

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

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


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

然后设置一下打通的内网网段范围

etcdctl set /coreos.com/network/config '{ "Network": "172.17.0.0/16" }'

3.启动flannel

setsid flanneld >> /mnt/k8s/logs/flanneld.log 2>&1  

mk-docker-opts.sh -i
source /run/flannel/subnet.env
rm /var/run/docker.pid
ifconfig docker0 ${FLANNEL_SUBNET}

重启Docker

service docker restart

4.启动 k8s master

以一台主机为master 

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 

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 

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 子节点

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

 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 &

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

 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 &

测试一下

kubectl run my-nginx --image=nginx --replicas=2 --port=800 --expose --service-overrides='{ "spec": { "type": "NodePort" } }'

kubectl get po  //查看是否正常启动


**坑 **

pause gcr.io 被墙

image pull failed for gcr.io/google_containers/pause:2.0

使用docker hub的镜像代替

docker pull kubernetes/pause docker tag kubernetes/pause gcr.io/google_containers/pause:2.0

K8s 核心概念简介

pod

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

**replication controller **

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

service

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

K8s 核心组件简介

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 实现路由转发

工作流程

DNS 插件安装

使用ip地址方式不太容易记忆 集群内可以使用dns绑定ip并自动更新维护

安装方式很简单 调用一下脚本就可以了

cd cluster/ubuntu
KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh

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

实践一下

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

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

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

首先创建一个docker-hello-world-rc.yaml 一个rc和 pod

apiVersion: v1
kind: ReplicationController
metadata:
  name: test-rc
spec:
  replicas: 2
  selector:
    name: test
    version: VERSION
  template:
    metadata:
      labels:
        name: test
        version: VERSION
    spec:
      containers:
        - name: test
          image: IMAGE
          env:
           - name: "JAVA_OPTS"
             value: "-Duser.timezone=GMT+8"
          ports:
            - containerPort: 8080


再创建 docker-hello-world-svc.yaml 对外暴露服务

apiVersion: v1
kind: Service
metadata:
  name: test-svc
spec:
  ports:
    - port: 20000
      targetPort: 8080
      protocol: TCP
  type: NodePort
  selector:
    name: test


在编写一下jenkins 的脚本

#!/bin/bash

#build in jenkins 

REG_URL= xx 你的docker 仓库 地址
KUBE_MASTER=  xx  k8s master api service 地址

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

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

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

if [ $? -eq 0 ]; then
echo "maven install succ"
else
echo "maven install fail exit"
exit 1
fi

docker build -t  $TAG  $WORKSPACE/.

docker push   $TAG

docker rmi $TAG

 function kube(){

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

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

if [ ! "$KUBEDNS" ]; then
  echo "create rc and svc "
   kubectl -s $KUBE_MASTER   create  -f $RC_FILE   
   kubectl -s $KUBE_MASTER   create  -f $SVC_FILE  
else
  echo "start rolling-update"
  #一般只更新镜像
  kubectl -s $KUBE_MASTER   rolling-update  $JOB_NAME-rc  --image=$TAG
fi

}

kube

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

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

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

kubectl describe svc 查看分配的Nodeport

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

代码地址 kube-hello-world分支

下回预告 使用 swarmKit构建Docker集群 重回swarm的怀抱 不过按照现在的发展速度至少是一年以后的事啦 且听下回分解

原文地址:https://my.oschina.net/jayqqaa12/blog/693919文章来源地址https://www.toymoban.com/news/detail-827805.html

喜欢 0

到了这里,关于从swarm到kubernetes Docker容器云实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生|Docker系列第4篇】Docker的容器的入门实践

    欢迎来到云原生系列的第4篇博客!在前面的两篇博客中,我们已经学习了Docker镜像的基本概念和入门实践。本篇博客将带您深入了解Docker容器,探索如何使用Docker容器来构建、运行和管理应用程序。无论您是新手还是有一定经验的开发者,通过本篇博客的实践指导,您将能够

    2024年02月17日
    浏览(48)
  • Docker和Kubernetes与容器自动化管理:最佳实践

    作者:禅与计算机程序设计艺术 容器技术在企业级应用中扮演着重要角色,通过容器化部署应用程序可以极大的降低IT成本、缩短交付周期、提高资源利用率。对于容器技术来说,Docker和Kubernetes无疑是其两大支柱产品。由于Docker和Kubernetes都提供了统一的编排接口(API),使

    2024年02月07日
    浏览(49)
  • 4.docker容器编排(docker compose 与 docker swarm)

    容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。 实例:一个java程序,依赖了mysql,redis,要想把 java 程序运行起来,则必须要先启动 mysql、redis。那么这三者这件就存在了依赖关联。   容器编排存在的意义: 依赖管理,当一个容

    2024年02月03日
    浏览(52)
  • 容器集群管理工具 Docker Swarm

    《了解和使用Docker》中有提到容器编排工具 docker compose ,不过只限于单机。如果现在需要搭建一个集群环境,提供了10台服务器用来部署应用以及其依赖的组件,比如5个 Tomcat 应用容器、3个Redis、5个 Mysql、3个 Nginx ,你会如何部署? 重复执行部署操作?如果需要扩缩容,手动

    2024年02月08日
    浏览(48)
  • 【云原生 | 55】Docker三剑客之Docker Swarm简介和安装

    🍁 博主简介 :         🏅云计算领域优质创作者         🏅2022年CSDN新星计划python赛道第一名         🏅2022年CSDN原力计划优质作者         🏅阿里云ACE认证高级工程师         🏅阿里云开发者社区专家博主 💊 交流社区 :CSDN云计算交流社区欢迎您的

    2024年02月11日
    浏览(37)
  • 深入探讨Docker生态系统,Docker Compose vs. Docker Swarm vs. Kubernetes:深入比较

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容:Docker生态系统 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 Docker已经成为现代容器化应用程序的事实标准,但

    2024年02月07日
    浏览(38)
  • 使用 Docker Swarm(集群) 和Docker Stack(堆栈)部署容器化应用

    说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管理你的服务。 与Kubernetes相比,Docker Swarm的群集管理功能相对简单,Swarm更适合于小型到中型的容器

    2024年04月25日
    浏览(32)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(66)
  • Docker Swarm: 容器编排的力量和优势深度解析

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容:Docker Swarm 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 在现代应用开发和部署中,容器化技术以其轻量、可移

    2024年02月01日
    浏览(46)
  • 【云原生】详细学习Docker-Swarm部署搭建和基本使用

      个人主页: 征服bug-CSDN博客 kubernetes专栏: 云原生_征服bug的博客-CSDN博客 目录 Docker-Swarm编排 1.概述 2.docker swarm优点 3.节点类型 4.服务和任务 5.路由网格 6.实践Docker swarm         Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机,使得容器

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包