一、利用ansible部署kubernetes集群环境准备

  基于二进制方式部署和利用ansible-playbook实现自动化:既提供一键安装脚本,也可以分步执行安装各个组件,同时讲解每一步主要参数配置和注意事项;二进制方式部署有助于理解系统各组件的交互原理和熟悉组件启动参数,有助于快速排查解决实际问题。

版本组件

  kubernetes v1.9.7
  etcd v3.3.4
  docker 18.03.0-ce
  calico/node:v3.0.6
  calico/cni:v2.0.5
  calico/kube-controllers:v2.0.4
  centos 7.3+
 
集群规划和基础参数设定:
  1.高可用集群所需节点配置如下:
    部署节点×1:运行ansible脚本的节点
    etcd节点×3:注意etcd集群节点必须是1,3,5,7……奇数个节点
    master节点×1:运行集群主要组件
    node节点×3:真正应用部署的节点,根据需要增加机器配置和节点数
  2.在部署节点准备ansible:使用ansible的docker环境启动:
    1° 下载内部源配置脚本并运行脚本:
  1. wget http://download2.yunwei.edu/shell/yum-repo.sh
    bash yum-repo.sh

    2°下载并安装docker:

  1. wget http://download2.yunwei.edu/shell/docker.tar.gz
  2. 解压后切换到docker目录下
  3. 运行docker.sh脚本
  4. 查看docker服务是否启动
    docker image
  1. #/bin/bash
  2.  
  3. tar zxvf docker-app.tar.gz -C /usr/local/bin/
  4.  
  5. mkdir -p /etc/docker
  6. mkdir -p /etc/docker/certs.d/reg.yunwei.edu
  7.  
  8. cp ca.crt /etc/docker/certs.d/reg.yunwei.edu/
  9.  
  10. echo "172.16.254.20 reg.yunwei.edu">>/etc/hosts
  11.  
  12. cat <<EOF>/etc/docker/daemon.json
  13. {
  14. "registry-mirrors": ["http://cc83932c.m.daocloud.io"],
  15. "max-concurrent-downloads": ,
  16. "log-driver": "json-file",
  17. "log-level": "warn",
  18. "log-opts": {
  19. "max-size": "10m",
  20. "max-file": ""
  21. }
  22. }
  23. EOF
  24.  
  25. cat <<EOF>/etc/systemd/system/docker.service
  26. [Unit]
  27. Description=Docker Application Container Engine
  28. Documentation=http://docs.docker.io
  29.  
  30. [Service]
  31. Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
  32. ExecStart=/usr/local/bin/dockerd
  33. ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/ -j ACCEPT
  34. ExecReload=/bin/kill -s HUP $MAINPID
  35. Restart=on-failure
  36. RestartSec=
  37. LimitNOFILE=infinity
  38. LimitNPROC=infinity
  39. LimitCORE=infinity
  40. Delegate=yes
  41. KillMode=process
  42.  
  43. [Install]
  44. WantedBy=multi-user.target
  45. EOF
  46.  
  47. systemctl daemon-reload && systemctl enable docker.service && systemctl start docker.service

docker.sh   

    3°下载并运行docker版的ansible:

  1. docker pull reg.yunwei.edu/learn/ansible:alpine3
  2. docker run -itd -v /etc/ansible:/etc/ansible -v /etc/kubernetes/:/etc/kubernetes/ -v /root/.kube:/root/.kube -v /usr/local/bin/:/usr/local/bin/ 1acb4fd5df5b /bin/sh

    4° 配置每台机器之间主机名解析

    5° 进入ansible容器,设置免密钥登录

  1. 测试各节点是否正常
    ansible all -m ping

  3.在部署节点上传ansible工作文件:

  1. wget http://download2.yunwei.edu/shell/kubernetes.tar.gz
    解压后:
    bash       harbor-offline-installer-v1.4.0.tgz  k8s197.tar.gz           scope.yaml
    ca.tar.gz  image.tar.gz                         kube-yunwei-197.tar.gz  sock-shop 
    

  1. 解压kube-yunwei-197.tar.gz 并将kube-yunwei-下的所有文件移动到ansible下,删除kube-yunwei-
    [root@localhost kubernetes]# tar xf kube-yunwei-.tar.gz
  2. [root@localhost kubernetes]# ls
  3. bash harbor-offline-installer-v1.4.0.tgz k8s197.tar.gz kube-yunwei-.tar.gz sock-shop
  4. ca.tar.gz image.tar.gz kube-yunwei- scope.yaml
  5. [root@localhost kubernetes]# cd kube-yunwei-
  6. [root@localhost kube-yunwei-]# ls
  7. .prepare.yml .docker.yml .kube-node.yml .clean.yml bin manifests tools
  8. .etcd.yml .kube-master.yml .network.yml ansible.cfg example roles
  9. [root@localhost kube-yunwei-]# mv * /etc/ansible/
  1. 解压 k8s197.tar.gz 并将bin下的所有文件移动到ansible下的bin目录下,删除kubernetes下的bin
    [root@localhost kubernetes]# tar xf k8s197.tar.gz
  2. [root@localhost kubernetes]# ls
  3. bash ca.tar.gz image k8s197.tar.gz kube-yunwei-.tar.gz sock-shop
  4. bin harbor-offline-installer-v1.4.0.tgz image.tar.gz kube-yunwei- scope.yaml
  5. [root@localhost kubernetes]# cd bin
  6. [root@localhost bin]# ls
  7. bridge docker dockerd etcdctl kubectl portmap
  8. calicoctl docker-compose docker-init flannel kubelet
  9. cfssl docker-containerd docker-proxy host-local kube-proxy
  10. cfssl-certinfo docker-containerd-ctr docker-runc kube-apiserver kube-scheduler
  11. cfssljson docker-containerd-shim etcd kube-controller-manager loopback
  12. [root@localhost bin]# mv * /etc/ansible/bin/
  13. [root@localhost bin]# ls
  14. [root@localhost bin]# cd /etc/ansible/bin/
  15. [root@localhost bin]# ls
  16. bridge docker dockerd etcdctl kubectl portmap
  17. calicoctl docker-compose docker-init flannel kubelet VERSION.md
  18. cfssl docker-containerd docker-proxy host-local kube-proxy
  19. cfssl-certinfo docker-containerd-ctr docker-runc kube-apiserver kube-scheduler
  20. cfssljson docker-containerd-shim etcd kube-controller-manager loopback
  1. 切换到example目录下,将 hosts.s-master.example 文件复制到ansible目录下,并改名为hosts
    [root@localhost kubernetes]# cd /etc/ansible/
  2. [root@localhost ansible]# ls
  3. .prepare.yml .docker.yml .kube-node.yml .clean.yml bin manifests tools
  4. .etcd.yml .kube-master.yml .network.yml ansible.cfg example roles
  5. [root@localhost ansible]# cd example/
  6. [root@localhost example]# ls
  7. hosts.s-master.example
  8. [root@localhost example]# cp hosts.s-master.example ../hosts
  9. [root@localhost example]# cd ..
  10. [root@localhost ansible]# ls
  11. .prepare.yml .docker.yml .kube-node.yml .clean.yml bin hosts roles
  12. .etcd.yml .kube-master.yml .network.yml ansible.cfg example manifests tools
  13. [root@localhost ansible]# vim hosts
  1. # 在deploy节点生成CA相关证书,以及kubedns.yaml配置文件
  2. - hosts: deploy
  3. roles:
  4. - deploy
  5.  
  6. # 集群节点的公共配置任务
  7. - hosts:
  8. - kube-master
  9. - kube-node
  10. - deploy
  11. - etcd
  12. - lb
  13. roles:
  14. - prepare
  15.  
  16. # [可选]多master部署时的负载均衡配置
  17. - hosts: lb
  18. roles:
  19. - lb

01.prepare.yml

  1. - hosts: etcd
  2. roles:
  3. - etcd

02.etcd.yml

  1. - hosts:
  2. - kube-master
  3. - kube-node
  4. roles:
  5. - docker

03.docker.yml

  1. - hosts: kube-master
  2. roles:
  3. - kube-master
  4. - kube-node
  5. # 禁止业务 pod调度到 master节点
  6. tasks:
  7. - name: 禁止业务 pod调度到 master节点
  8. shell: "{{ bin_dir }}/kubectl cordon {{ NODE_IP }} "
  9. when: DEPLOY_MODE != "allinone"
  10. ignore_errors: true

04.kube-master.yml

  1. - hosts: kube-node
  2. roles:
  3. - kube-node

05.kube-node.yml

  1. # 集群网络插件部署,只能选择一种安装
  2. - hosts:
  3. - kube-master
  4. - kube-node
  5. roles:
  6. - { role: calico, when: "CLUSTER_NETWORK == 'calico'" }
  7. - { role: flannel, when: "CLUSTER_NETWORK == 'flannel'" }

06.network.yml

  1. 编辑hosts文件
    # 部署节点:运行ansible 脚本的节点
  2. [deploy]
  3. 192.168.42.30
  4.  
  5. # etcd集群请提供如下NODE_NAME、NODE_IP变量,请注意etcd集群必须是1,,,...奇数个节点
  6. [etcd]
  7. 192.168.42.121 NODE_NAME=etcd1 NODE_IP="192.168.42.121"
  8. 192.168.42.122 NODE_NAME=etcd2 NODE_IP="192.168.42.122"
  9. 192.168.42.172 NODE_NAME=etcd3 NODE_IP="192.168.42.172"
  10.  
  11. [kube-master]
  12. 192.168.42.121 NODE_IP="192.168.42.121"
  13.  
  14. [kube-node]
  15. 192.168.42.121 NODE_IP="192.168.42.121"
  16. 192.168.42.122 NODE_IP="192.168.42,122"
  17. 192.168.42.172 NODE_IP="192.168.42.172"
  18.  
  19. [all:vars]
  20. # ---------集群主要参数---------------
  21. #集群部署模式:allinone, single-master, multi-master
  22. DEPLOY_MODE=single-master
  23.  
  24. #集群 MASTER IP
  25. MASTER_IP="192.168.42.121"
  26.  
  27. #集群 APISERVER
  28. KUBE_APISERVER="https://192.168.42.121:6443"
  29.  
  30. #TLS Bootstrapping 使用的 Token,使用 head -c /dev/urandom | od -An -t x | tr -d ' ' 生成
  31. BOOTSTRAP_TOKEN="d18f94b5fa585c7123f56803d925d2e7"
  32.  
  33. # 集群网络插件,目前支持calico和flannel
  34. CLUSTER_NETWORK="calico"
  35.  
  36. # 部分calico相关配置,更全配置可以去roles/calico/templates/calico.yaml.j2自定义
  37. # 设置 CALICO_IPV4POOL_IPIP=“off”,可以提高网络性能,条件限制详见 .安装calico网络组件.md
  38. CALICO_IPV4POOL_IPIP="always"
  39. # 设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手动指定端口"interface=eth0"或使用如下自动发现
  40. IP_AUTODETECTION_METHOD="can-reach=223.5.5.5"
  41.  
  42. # 部分flannel配置,详见roles/flannel/templates/kube-flannel.yaml.j2
  43. FLANNEL_BACKEND="vxlan"
  44.  
  45. # 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用 IP:Port 可达
  46. SERVICE_CIDR="10.68.0.0/16"
  47.  
  48. # POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达
  49. CLUSTER_CIDR="172.20.0.0/16"
  50.  
  51. # 服务端口范围 (NodePort Range)
  52. NODE_PORT_RANGE="20000-40000"
  53.  
  54. # kubernetes 服务 IP (预分配,一般是 SERVICE_CIDR 中第一个IP)
  55. CLUSTER_KUBERNETES_SVC_IP="10.68.0.1"
  56.  
  57. # 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
  58. CLUSTER_DNS_SVC_IP="10.68.0.2"
  59.  
  60. # 集群 DNS 域名
  61. CLUSTER_DNS_DOMAIN="cluster.local."
  62.  
  63. # etcd 集群间通信的IP和端口, **根据实际 etcd 集群成员设置**
  64. ETCD_NODES="etcd1=https://192.168.42.121:2380,etcd2=https://192.168.42.122:2380,etcd3=https://192.168.42.172:2380"
  65.  
  66. # etcd 集群服务地址列表, **根据实际 etcd 集群成员设置**
  67. ETCD_ENDPOINTS="https://192.168.42.121:2379,https://192.168.42.122:2379,https://192.168.42.172:2379"
  68.  
  69. # 集群basic auth 使用的用户名和密码
  70. BASIC_AUTH_USER="admin"
  71. BASIC_AUTH_PASS="admin"
  72.  
  73. # ---------附加参数--------------------
  74. #默认二进制文件目录
  75. bin_dir="/usr/local/bin"
  76.  
  77. #证书目录
  78. ca_dir="/etc/kubernetes/ssl"
  79.  
  80. #部署目录,即 ansible 工作目录
  81. base_dir="/etc/ansible"

二、部署kubernetes过程

  1. 进入容器,查看ansible目录下是否有文件,并且查看能否ping通其他节点
    [root@localhost ansible]# docker exec -it 0918862b8730 /bin/sh
  2. / # cd /etc/ansible/
  3. /etc/ansible # ls
  4. .prepare.yml .network.yml hosts
  5. .etcd.yml .clean.yml manifests
  6. .docker.yml ansible.cfg roles
  7. .kube-master.yml bin tools
  8. .kube-node.yml example
  9. /etc/ansible # ansible all -m ping
  10. 192.168.42.122 | SUCCESS => {
  11. "changed": false,
  12. "ping": "pong"
  13. }
  14. 192.168.42.172 | SUCCESS => {
  15. "changed": false,
  16. "ping": "pong"
  17. }
  18. 192.168.42.121 | SUCCESS => {
  19. "changed": false,
  20. "ping": "pong"
  21. }
  22. 192.168.42.30 | SUCCESS => {
  23. "changed": false,
  24. "ping": "pong"
  25. }
  1. ansible-playbook .prepare.yml
  2. ansible-playbook .etcd.yml
  3. ansible-playbook .docker.yml
  4. ansible-playbook .kube-master.yml
  5. ansible-playbook .kube-node.yml
  6. 在执行06.network.yml之前要确保其他节点有镜像,所以解压image.tar.gz
  1. [root@cicd kubernetes]# ls
  2. bash ca.tar.gz image k8s197.tar.gz kube-yunwei- scope.yaml
  3. bin harbor-offline-installer-v1.4.0.tgz image.tar.gz kubernetes.tar.gz kube-yunwei-.tar.gz sock-shop
  4. [root@cicd kubernetes]# cd image
  5. [root@cicd image]# ls
  6. calico-cni-v2.0.5.tar coredns-1.0..tar.gz influxdb-v1.3.3.tar
  7. calico-kube-controllers-v2.0.4.tar grafana-v4.4.3.tar kubernetes-dashboard-amd64-v1.8.3.tar.gz
  8. calico-node-v3.0.6.tar heapster-v1.5.1.tar pause-amd64-3.1.tar
  9. [root@cicd image]# scp ./* node1:/root/image
    [root@cicd image]# scp ./* node2:/root/image
    [root@cicd image]# scp ./* node3:/root/image
  1. node节点:
    [root@node1 image]# for i in `ls`;do docker load -i $i;done
  1. 部署节点:
    ansible-playbook .network.yml
  1. CoreDNS,该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求。
    /etc/ansible # ls
  2. .prepare.yml .docker.yml .network.yml bin manifests
  3. .etcd.retry .kube-master.yml .clean.yml example roles
  4. .etcd.yml .kube-node.yml ansible.cfg hosts tools
  5. /etc/ansible # cd manifests/
  6. /etc/ansible/manifests # ls
  7. coredns dashboard efk heapster ingress kubedns
  8. /etc/ansible/manifests # cd coredns/
  9. /etc/ansible/manifests/coredns # ls
  10. coredns.yaml
  11. /etc/ansible/manifests/coredns # kubectl create -f .
  12. serviceaccount "coredns" created
  13. clusterrole "system:coredns" created
  14. clusterrolebinding "system:coredns" created
  15. configmap "coredns" created
  16. deployment "coredns" created
  17. service "coredns" created
  18.  
  19. /etc/ansible/manifests # ls
    coredns    dashboard  efk        heapster   ingress    kubedns
    /etc/ansible/manifests # cd dashboard/
    /etc/ansible/manifests/dashboard # ls
    1.6.3                      kubernetes-dashboard.yaml  ui-read-rbac.yaml
    admin-user-sa-rbac.yaml    ui-admin-rbac.yaml
    /etc/ansible/manifests/dashboard # kubectl create -f .
    serviceaccount "admin-user" created
    clusterrolebinding "admin-user" created
    secret "kubernetes-dashboard-certs" created
    serviceaccount "kubernetes-dashboard" created
    role "kubernetes-dashboard-minimal" created
    rolebinding "kubernetes-dashboard-minimal" created
    deployment "kubernetes-dashboard" created
    service "kubernetes-dashboard" created
    clusterrole "ui-admin" created
    rolebinding "ui-admin-binding" created
    clusterrole "ui-read" created
    rolebinding "ui-read-binding" created
  1. [root@cicd ansible]# kubectl get pod -n kube-system -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. coredns-6ff7588dc6-l8q4h / Running 7m 172.20.0.2 192.168.42.122
  4. coredns-6ff7588dc6-x2jq5 / Running 7m 172.20.1.2 192.168.42.172
  5. kube-flannel-ds-c688h / Running 14m 192.168.42.172 192.168.42.172
  6. kube-flannel-ds-d4p4j / Running         14m 192.168.42.122 192.168.42.122
  7. kube-flannel-ds-f8gp2 / Running 14m 192.168.42.121 192.168.42.121
  8. kubernetes-dashboard-545b66db97-z9nr4 / Running 1m 172.20.1.3 192.168.42.172
  1. [root@cicd ansible]# kubectl cluster-info
  2. Kubernetes master is running at https://192.168.42.121:6443
  3. CoreDNS is running at https://192.168.42.121:6443/api/v1/namespaces/kube-system/services/coredns:dns/proxy
  4. kubernetes-dashboard is running at https://192.168.42.121:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
  5.  
  6. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

 密钥获取:kubectl -n kube-system describe secret $(kubectl -n kube-system get secret|grep admin-user|awk '{print $1}')
 
 
 

k8s集群部署(3)的更多相关文章

  1. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  2. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  3. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  4. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

  6. (视频)asp.net core系列之k8s集群部署视频

    0.前言 应许多网友的要求,特此录制一下k8s集群部署的视频.在录制完成后发现视频的声音存在一点瑕疵,不过不影响大家的观感. 一.视频说明 1.视频地址: 如果有不懂,或者有疑问的欢迎留言.视频分为两 ...

  7. 在k8s集群部署SonarQube

    目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...

  8. 基于k8s集群部署prometheus监控ingress nginx

    目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...

  9. 基于k8s集群部署prometheus监控etcd

    目录 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署prometheus监控 ...

  10. 菜鸟系列k8s——k8s集群部署(2)

    k8s集群部署 1. 角色分配 角色 IP 安装组件 k8s-master 10.0.0.170 kube-apiserver,kube-controller-manager,kube-schedul ...

随机推荐

  1. web开发:jquery高级

    一.jq选择器 二.属性操作 三.jq轮播图 四.样式操作 五.jq动事件 六.jq动画 七.自定义动画 八.jq动画案例 一.jq选择器 - css3语法选择器 ```js$('css3选择器位') ...

  2. LaTeX新人使用教程[转载]

    LaTeX新人教程,30分钟从完全陌生到基本入门 by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方 ...

  3. 我对line-height及vertical-align的一点理解

    张鑫旭老师在文章<我对CSS vertical-align的一些理解与认识(一)>中提到: vertical-align:middle属性的表现与否,仅仅与其父标签有关,至于我们通常看到的 ...

  4. 关于properties文件的读取(Java/spring/springmvc/springboot)

    一.Java读取properties文件 1.基于ClassLoder读取配置文件 注意:该方式只能读取类路径下的配置文件,有局限但是如果配置文件在类路径下比较方便. Properties prope ...

  5. pycharm mysql数据源配置、SQL方言配置

    会发现有提示,看着不爽,但不影响运行程序, 这里提示没有配置数据源,现在配置MYSQL数据源 然后看到右边Database选项卡,点击 然后可能会出现网络防火墙提示,选择全部允许,之后可能会在pych ...

  6. 「BZOJ 2653」middle「主席树」「二分」

    题意 一个长度为\(n\)的序列\(a\),设其排过序之后为\(b\),其中位数定义为\(b[n/2]\),其中\(a,b\)从\(0\)开始标号,除法取下整.给你一个长度为\(n\)的序列\(s\) ...

  7. 彩色模型,CIE XYZ,CIE RGB

    学习DIP第8天 转载请标明出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意. ...

  8. Django基础之命名空间模式(include)

    即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL. 例如: project中的urls.py from django.conf.urls import url, ...

  9. HDFS 特殊权限位

    HDFS 特殊权限位 标签(空格分隔): Hadoop 之前对HDFS更或者说是对Linux中文件的权限没有进行一个完整的学习,只是知道有所有者.所属组和其它权限,具体到某个人的权限有读(r).写(w ...

  10. MySQL字段命名不能使用的MySQL关键字

    #今天遇到一个问题,把某一字段重新命名为condition时报错,于是联想到可能是MySQL的关键字,用``引起来后,问题解决. #在MySQL数据库中,Table字段不能使用MySQL关键字: #[ ...