多K8S集群运维管理参考
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多K8S集群运维管理参考相关的知识,希望对你有一定的参考价值。
参考技术A可以通过--kubeconfig 命令行参数来选择操作不同集群
使用默认的 kubeconfig 文件, 需要将多个 kubeconfig 合并,保存在kubeconfig 的默认位置 $HOME/.kube/config , 合并后的参考格式如下:
kubeconfig 中定义了 (clusters)集群、(users)用户和 以及相关联的(contexts)上下文,如果使用Uk8s 可以在控制台: 概览-> 内网凭证/外网凭证 查看需要的凭证,然后按照上述格式补全即可
方式三:使用ansible Playbook 来管理集群内的容器应用
场景描述: 目前我们需要使用helm安装一个external-dns 用来将 ingess对接的域名解析规则,自动同步到DNS服务器,使用shell命令操作参考如下:
将以上操作转化为 ansible-playbook 的tasks 可以拆分为四个 tasks ,
将上诉文件保存为 deploy_external_dns.yaml, 执行命令 ansible-playbook deploy_external_dns.yaml 命令执行成功回看到返回如下类似结果:
方式四:使用ansible-playbook roles来组织管理集群变更tasks
在方式三中,如果是管理一个集群,编写一个deploy_external_dns.yaml就能完成工作,如果管理多个集群,就要编写多个yaml文件,并且重复编写很多差异不多的tasks 实际操作可能类似这个样子:
经过对比分析,这些tasks 主要差异变量:
只要将以上两个变量参考可配置化,最原始的四个 tasks就可以复用,然后使用 Ansible role 重新组织tasks 文件,拆分为两个role:
其中 external_dns 依赖 helm-repository 然后目录结构如下
roles/helm-repository/main.yml
roles/external-dns/tasks/main.yml
roles/external-dns/meta/main.yml
新建一个文件 deploy-chart-external-dns 来引用 role:helm-repository
最后,仅仅需要维护一个可复用的 role:helm-repository ,以及在deploy-chart-external-dns 定义要集群属性等变量,就可以轻松的维护多集群内的各类容器应用了
执行命令:ansible-playbook deploy-chart-external-dns 返回结果如下:
运维之我的docker-集群的管理-swarm
使用docker引擎的swarm模式是v1.12.0版本以后的新特性,我们使用docker cli创建一个swarm,部署和管理应用服务集群。
swarm集群特色
docker引擎综合了集群管理功能:
默认自带集群服务的管理工具,不需要额外的工具。
分布式的设计思路:
部署docker时不区分节点角色,当启动时根据不同角色使用不同参数。docker引擎分为管理器和工作程序 ,这就意味着你可以使用一个磁盘构建一个完整集群。
服务声明模式
docker引擎可以让你在海量应用服务里面,给服务定义你想要状态。例如:你可以描述一个程序服务集群包括消息队列服务,数据库后端,web前端组成。
服务的弹性可伸缩
对于你想要运行的每个服务你可以声明想要运行的任务数。当你批量启动和停止服务时,swarm集群管理器自动适应添加和移除任务来达到你想要维护的服务状态
服务状态自愈
swarm管理器通过不断的监控集群状态,让集群从现实状态不断接近你期望的状态。例如:你现在需要运行10个容器副本,并且其中两个容器副本worker机器崩溃了,这个swarm manager将创建两个容器副本来替换崩溃的这两个副本。
多主机网络
你可以创建容器指定一个覆盖型网络。swarm 管理器初始化或更新应用程序时,会自动为覆盖网络上的容器分配地址。
服务发现机制
swarm管理器节点会分配给每个服务唯一dns容器名并负载均各个容器。您可以通过嵌入在swarm中的DNS服务器查询在群中运行的每个容器。
负载均衡
你可以使用容器暴露的端口使用外部应用进行负载均衡,在内部你可以使用swarm指定如何在节点之间分发服务容器。
默认安全网络
每个swarm的节点里强制使用TLS双向认证和加密传输,以保证本机和其它节点间通讯安全。这里你可以使用自签名的证书或者自定义CA的证书。
滚动更新
在升级时你可以渐进的升级(滚动升级),swarm管理器可以控制多同节点间的调度部署升级的延时,一旦出现问题你可以回退到之前版本。
下面是swarm的重要概念和教程:
在docker引擎v1.12集成了swarmkit,主要包含了集群管理,编排功能。所以docker可以使用swarm模式创建一个集群或者加入一个现有集群。
swarm内分为service(服务)和node(节点)管理。
swarm节点分为两个角色:manager节点和Worker节点.
manager模式:任务的分派,执行编排,集群管理(集群状态,任务数维持).
Worker模式:接受并执行manager节点分派任务.默认情况下,manager节点还将服务作为Worker节点运行,当你把它配置为manager-only的时候就可以为独占管理器了。agent在每个worker 节点上运行,并报告分配给它的任务。Worker节点向manager节点通知其分配的任务的当前状态,使得manager可以维持每个Worker的期望状态。
这里swarm为了方便管理,使用了分片的概念,每个容器为一个分片,就像Elasticsearch的数据分片有点类似。如下图:
下面介绍下swarm的入门示例:
创建集下面几步:
1.在swarm模式下初始化一组docker引擎
2.添加节点到集群
3.部署应用服务到集群
4.通过swarm管理任何运行的东西
准备资源:
三个节点
docker>=1.12版本
管理主机ip地址
互相之间端口开放
集群管理节点需要使用tcp 2377端口
普通节点通讯使用tcp 和udp的7946端口
覆盖型网络流量端口tcp和udp的4789,50端口
在salt-node1初始化swarm
--advertise-addr 192.168.9.100 #发布对外服务地址,manage角色。
下面输出的内容是加入集群的方法。节点将作为manager或Worker加入,具体取决于--token标志的值。
[[email protected] salt]# docker swarm init --advertise-addr 192.168.198.116 Swarm initialized: current node (2pzv4kzc2p8f7c4wqlfupp9h9) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy 192.168.198.116:2377 To add a manager to this swarm, run ‘docker swarm join-token manager‘ and follow the instructions.
查询如何加入本集群
[[email protected] salt]# docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy 192.168.198.116:2377
#加入一个节点
[[email protected] salt]# docker swarm join > --token SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy > 192.168.198.116:2377 This node joined a swarm as a worker.
#加入一个节点
[[email protected] salt]# docker swarm join > --token SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy > 192.168.198.116:2377 This node joined a swarm as a worke
查看当前swarm状态
[[email protected] salt]# docker info Containers: 12 Running: 0 Paused: 0 Stopped: 12 Images: 54 Server Version: 1.13.0 ………….. Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: active NodeID: 2pzv4kzc2p8f7c4wqlfupp9h9 Is Manager: true ClusterID: lndygvfpz9mk09to8iw56s6bb Managers: 1 Nodes: 3 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Node Address: 192.168.198.116 Manager Addresses: 192.168.198.116:2377 Runtimes: runc ………
查看当前集群节点
下面的“*”代表你连接的节点。
[[email protected] salt]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2pzv4kzc2p8f7c4wqlfupp9h9 * salt-node1 Ready Active Leader g36lvv23ypjd8v7ovlst2n3yt salt-node3 Ready Active h14re9viizbs5yj3zunuo9zo8 salt-node2 Ready Active
部署服务到集群
连接到manager节点创建一个服务,参数描述:
--name指定helloworld 服务 --replicas 1 指定生成一个容器分片 --name helloworld 集群名称helloworld alpine 镜像名称,默认latest版本 ping docker.com 执行命令 [[email protected] salt]# docker service create --replicas 1 --name helloworld alpine ping docker.com 091zwwscs8rjv58a6vpev9ztj [[email protected] salt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17d5a5b9752b [email protected]:dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8 "ping docker.com" 5 seconds ago Up 2 seconds helloworld.1.tkqacb1kb0pftn5zaljff5g15 docker service create --name my_web --replicas 3 --publish 8080:80 nginx 把容器的80端口暴露到本机的8080端口
批量启动节点
[[email protected] salt]# docker service scale helloworld=5 helloworld scaled to 5 [[email protected] salt]# docker service ls --filter name=redis3 ID NAME MODE REPLICAS IMAGE ig4hg5e8233r redis3 replicated 3/3 registry.cn-hangzhou.aliyuncs.com/forker/redis:latest $ docker service create --mode global --name backend backend:latest b4g08uwuairexjub6ome6usqh $ docker service scale backend=10 backend: scale can only be used with replicated mode
查看服务状态
[[email protected] salt]# docker service inspect --pretty helloworld ID: 091zwwscs8rjv58a6vpev9ztj Name: helloworld Service Mode: Replicated Replicas: 5 Placement: UpdateConfig: Parallelism: 1 On failure: pause Max failure ratio: 0 ContainerSpec: Image: alpine:[email protected]:dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8 Args: ping docker.com Resources: Endpoint Mode: vip
服务信息
[[email protected] salt]# docker service inspect --pretty helloworld ID: 091zwwscs8rjv58a6vpev9ztj Name: helloworld Service Mode: Replicated Replicas: 1 Placement: UpdateConfig: Parallelism: 1 On failure: pause Max failure ratio: 0 ContainerSpec: Image: alpine:[email protected]:dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8 Args: ping docker.com Resources: Endpoint Mode: vip
本文出自 “运维之我的历程” 博客,转载请与作者联系!
以上是关于多K8S集群运维管理参考的主要内容,如果未能解决你的问题,请参考以下文章
运维实战 kubernetes(k8s) 之 pod 的建立