容器编排

什么是容器编排

容器编排是指容器的集群化管理和容器调度。常有的功能有启动容器,根据资源调动容器所在的位置,会跟踪和监控容器的状态,如果一个容器异常故障,编排系统会重启容器。在部署和更新容器时,如果出现问题,还可以回滚。常用的容器编排系统有Docker swarm 、Kuberbetes等。

Docker swarm简介

Docker swarm架构图 Docker swarm

docker 节点(node)

  • manager节点维持集群状态,调动任务,集群服务。manager节点采用raft一致性协议,所以建议至少的2n+1,这个集群会通过raft选举出一位leader。

  • worker节点是真正执行docker容器的节点。manager节点本身也可以是worker节点,当然可以配置成不作为worker节点。worke之间的状态使用gossip分布式是一致性协议,gossip的特性是最终一致性和幂等性,相比于raft,gossip的时效性差一点,但是raft集群数(基于log的状态机复制)是有限制的。

任务(task), 服务(service),容器

任务,服务,容器

例如上图,我们定义了一个http server服务,我们在三个http服务三个实例之间实现负载平衡。上图图显示了具有三个副本的http服务,这三个实例中的每个实例都是集群中的任务。容器是一个孤立的进程。在群体模式模型中,每个任务仅调用一个容器。容器处于活动状态后,调度程序将识别出该任务处于运行状态。

Docker swarm使用

  • 初始化集群

        #manager
        docker swarm init -advertise-addr 192.168.99.100
    
        #worker
        docker swarm join --token XXXX
        
        #查看集群
        docker node ls
        $ docker node ls
        ID                            HOSTNAME                        STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
        itbo6pz5lm94vg21huw22lyxn *   ulucu-develop-008.int.uops.cn   Ready               Active              Leader              18.06.1-ce
        h3gvgyslfg0pxpu5l57s5pn56     wida                            Ready               Active                                  18.03.1-ce
    
  • 新建服务

        #分布式运用部署
        #swarm 下面的overlay 网络创建
        docker network create -d overlay demo #在使用后才可以在node节点可见
        docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network=demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7 
        docker service create --name wordpress -p 80:80 --network=demo --replicas 3 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql wordpress 
    
        #查看service 列表
        docker service ls
        #查看某个服务的容器分布情况
        docker service ps wordpress
        #来查看某个服务的日志 
        docker service logs wordpress
    
  • 更新服务

        #service服务伸缩
        docker service scale wordpress=5    #拓展到5台
        #service 无中断更新
        docker service update --image=xxx:2.0 wordpress
        #service 更新端口
        docker service update --public-rm 8080:80 --public-add 8088:80 wordpress
    
  • 删除服务

        docker service rm wordpress
    
  • 使用docker stack 我们用一个配置文件描述一组服务,然后docker stack 相关命令管理管理这一组服务。

    我们创建问文件docker-compose.yaml

        version: "3"
        services:
        wordpress:
            image: wordpress
            ports:
            - 80:80
            networks:
            - overlay
            environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: wordpressdocker stack 
            replicas: 3
        db:
            image: mysql
            command: --default-authentication-plugin=mysql_native_password
            networks:
            - overlay
            volumes:
            - db-data:/var/lib/mysql
            environment:
            MYSQL_ROOT_PASSWORD: somewordpress
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress
            MYSQL_PASSWORD: wordpress
            deploy:
            placement:
                constraints: [node.role == manager]
        visualizer:
            image: dockersamples/visualizer:stable
            ports:
            - "8080:8080"
            stop_grace_period: 1m30s
            volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
            deploy:
            placement:
                constraints: [node.role == manager]
        volumes:
        db-data:
        networks:
        overlay:
    

    stack 管理

        #部署服务
        docker stack deploy -c docker-compose.yml wordpress
    
        #查看stack
        docker stack ls
    
        #docer stack 更新
        修改docker-compose.yaml文件
        然后直接docker stack deploy -c docker-compose.yaml wordpress
    
        #删除stack
        docker stack down wordpress
    

Kuberbetes简介

coming soon

Kuberbetes使用

coming soon

参考资料