武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

Ansible+Vagrant 本地部署 Kubernetes 1.4

  • 2020-03-13
  • 本文字数:8072 字

    阅读完需:约 26 分钟

Ansible+Vagrant 本地部署 Kubernetes 1.4

Kubernetes 作为领先的容器集群管理工具,很多初学者都希望能第一时间学习使用它,但由于国内访问国外镜像站点很慢,部署一直是广大初学者的痛点。之前我们基于官方的安装文档分享过 Kubernetes 1.4 在阿里云美西节点的部署过程,本篇在上次分享的基础上更进一步,通过把相关镜像和软件安装源部署到内网,演示 Ansible 在 vagrant 上部署 K8S 的过程。

上篇(点击查看)我们介绍了 Kubernetes 1.4 在阿里云美西节点的部署过程,由于国内网络问题,很多留言表示并不通用,因此才有此下篇介绍本地部署 K8S 1.4 的具体方法。


Ansible 是一个简单的自动化运维工具,主要用于配置管理和应用部署,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack。Ansible 是通过 Python 语言开发。Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者。


Ansible 的第一个版本发布于 2012 年 2 月。Ansible 默认通过 SSH 协议管理机器,所以 Ansible 不需要安装客户端程序在服务器上。您只需要将 Ansible 安装在一台服务器,在 Ansible 安装完后,您就可以去管理控制其它服务器。不需要为它配置数据库,Ansible 不会以 daemons 方式来启动或保持运行状态,因此使用非常方便,所以这里用它来部署 K8S 1.4 测试环境,具体来讲 Ansible 可以实现以下目标:


  • 自动化部署应用

  • 自动化管理配置

  • 自动化的持续交付

  • 自动化的(AWS)云服务管理。

  • 从 1.3 开始支持新的资源类型 DaemonSet,kube-scheduler,kube-apiserver,kube-controller-manager,kube-proxy,kube-discovery 都已经放入 POD 中,使用更加方便了,上文提到 Kubernetes 1.4 的新功能是引入了 kubeadm 部署机制(暂时还是 alpha 版本),简化了 Kubernetes 集群的构建,我们部署一个 K8S 集群只要如下四个步骤,通过 Ansible 部署会更加简单,只要二步就 OK。


安装 docker、kubelet、kubectl、kubeadm


  • docker 容器运行环境

  • kubelet 集群最核心组件,它运行在所有集群中的机器,并实际操作 POD 和容器

  • kubectl 交互命令行控制集群

  • kubeadm Kubernetes 1.4 新增,替换之前的 kube-up.sh 脚本,用于集群的创建和节点的增加

  • kubeadm init 初始化 master

  • kubeadm join --token

  • 部署 POD 网络


之前和网友交流过,有些网友已经本地部署成功了,具体部署代码可以从我的 github 下载,下面开始我们的本地部署过程。

准备

准备三台虚拟机


  • 硬件配置: 三台 CPU1 核 内存 1.5 G 机器-需要可以访问国内网络(Ansible 安装和国内镜像下载需要)

  • 操作系统:Centos 7.2

  • 代码库-https://github.com/MarkThink/kubernetes1.4

  • Vagrant 配置文件 Vagrantfile:


# -*- mode: ruby -*-# # vi: set ft=ruby :
boxes = { ubuntu: "ubuntu/xenial64", centos: "centos7.2",}
distro = :centos # :ubuntu
Vagrant.configure(2) do |config|
(1..3).each do |i| config.vm.define "k8s#{i}" do |s| s.ssh.forward_agent = true s.vm.box = boxes[distro] s.vm.hostname = "k8s#{i}" s.vm.provision :shell, path: "scripts/bootstrap_ansible_#{distro.to_s}.sh" n = 10 + i s.vm.network "private_network", ip: "172.42.42.#{n}", netmask: "255.255.255.0", auto_config: true, virtualbox__intnet: "k8s-net" s.vm.provider "virtualbox" do |v| v.name = "k8s#{i}" v.memory = 1536 v.gui = false end end end
if Vagrant.has_plugin?("vagrant-cachier") config.cache.scope = :box endend
复制代码


启动虚拟机


vagrant up//进入虚拟机环境vagrant ssh k8s1vagrant ssh k8s2vagrant ssh k8s3#切换超级用户su#关闭 SEsetenforce 0#关闭 firewalldsystemctl stop firewalld && systemctl disable firewalld#进入三台虚拟机,更改 IP 地址为静态方式vi /etc/sysconfig/network-scripts/ifcfg-enp0s8BOOTPROTO=static#重启网络服务,使三台机器可以两两互通systemctl restart network
复制代码


将此文件 yum.repo 复制到 /etc/yum.repo.d/ 目录,准备 Kubernetes 安装的软件包。


cp yum.repo /etc/yum.repo.d/ #yum.repo[base]name=base-repobaseurl=http://yum.caicloud.com/base/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[epel]name=epel-repobaseurl=http://yum.caicloud.com/epel/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[extras]name=extras-repobaseurl=http://yum.caicloud.com/extras/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[kubernetes]name=kubernetes-repobaseurl=http://yum.caicloud.com/kubernetes/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7[updates]name=updates-repobaseurl=http://yum.caicloud.com/updates/enabled=1gpgcheck=0gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
复制代码

开始 Ansible 部署

vagrant ssh k8s1vagrant ssh k8s2vagrant ssh k8s3#切换超级用户su#使用 Ansible 安装 K8S 基础环境ansible-playbook /vagrant/ansible/k8s-base.yml -c local
复制代码


这会完成 docker、kubelet、kubectl、kubeadm 的安装,日志如下:


[WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-base : Ensure SSH Directories] ***************************************skipping: [localhost]TASK [k8s-base : Copy SSH Key Files] *******************************************skipping: [localhost] => (item=id_rsa)skipping: [localhost] => (item=id_rsa.pub)skipping: [localhost] => (item=config)TASK [k8s-base : Ensure Authorized SSH Key] ************************************skipping: [localhost]TASK [k8s-base : Remove Default Host Entry] ************************************changed: [localhost]TASK [k8s-base : Ensure Hosts File] ********************************************changed: [localhost] => (item={u'ip': u'172.42.42.11', u'name': u'k8s1'})changed: [localhost] => (item={u'ip': u'172.42.42.12', u'name': u'k8s2'})changed: [localhost] => (item={u'ip': u'172.42.42.13', u'name': u'k8s3'})TASK [k8s-base : Ensure Kubernetes APT Key] ************************************skipping: [localhost]TASK [k8s-base : Ensure Kubernetes APT Repository] *****************************skipping: [localhost]TASK [k8s-base : Ensure Base Kubernetes] ***************************************skipping: [localhost] => (item=[])TASK [k8s-base : file] *********************************************************changed: [localhost]TASK [k8s-base : Ensure Base Kubernetes] ***************************************changed: [localhost] => (item=[u'docker', u'kubelet', u'kubeadm', u'kubectl', u'kubernetes-cni'])TASK [k8s-base : Ensure docker.service] ****************************************changed: [localhost]TASK [k8s-base : Ensure kubelet.service] ***************************************changed: [localhost]TASK [k8s-base : Ensure firewalld.service] *************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : firewalld] ****************************************************changed: [localhost]TASK [k8s-base : command] ******************************************************changed: [localhost]PLAY RECAP *********************************************************************localhost                  : ok=14   changed=13   unreachable=0    failed=0
复制代码


由于网络问题,这里已经准备了相应的镜像:


docker pull registry.51yixiao.com/google_containers/kube-controller-manager-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0docker pull registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0docker pull registry.51yixiao.com/google_containers/kubedns-amd64:1.7docker pull registry.51yixiao.com/google_containers/exechealthz-amd64:1.1docker pull registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3docker pull registry.51yixiao.com/google_containers/pause-amd64:3.0docker pull registry.51yixiao.com/google_containers/etcd-amd64:2.2.5
复制代码


镜像前缀修改:


docker tag registry.51yixiao.com/google_containers/kube-controller-manager-amd64:v1.4.0 gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0 gcr.io/google_containers/kube-proxy-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0 gcr.io/google_containers/kube-apiserver-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0 gcr.io/google_containers/kube-scheduler-amd64:v1.4.0docker tag registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0 gcr.io/google_containers/kube-discovery-amd64:1.0docker tag registry.51yixiao.com/google_containers/kubedns-amd64:1.7 gcr.io/google_containers/kubedns-amd64:1.7docker tag registry.51yixiao.com/google_containers/exechealthz-amd64:1.1 gcr.io/google_containers/exechealthz-amd64:1.1docker tag registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3 gcr.io/google_containers/kube-dnsmasq-amd64:1.3docker tag registry.51yixiao.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0docker tag registry.51yixiao.com/google_containers/etcd-amd64:2.2.5 gcr.io/google_containers/etcd-amd64:2.2.5
复制代码


准备 POD 网络镜像:


docker pull registry.51yixiao.com/weaveworks/weave-kube:1.7.2docker pull registry.51yixiao.com/weaveworks/weave-npc:1.7.2
复制代码


镜像前缀修改:


docker tag registry.51yixiao.com/weaveworks/weave-kube:1.7.2 weaveworks/weave-kube:1.7.2docker tag registry.51yixiao.com/weaveworks/weave-npc:1.7.2 weaveworks/weave-npc:1.7.2Master 节点:
gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0gcr.io/google_containers/kube-proxy-amd64:v1.4.0gcr.io/google_containers/kube-apiserver-amd64:v1.4.0gcr.io/google_containers/kube-scheduler-amd64:v1.4.0gcr.io/google_containers/kube-discovery-amd64:1.0gcr.io/google_containers/kubedns-amd64:1.7gcr.io/google_containers/exechealthz-amd64:1.1gcr.io/google_containers/kube-dnsmasq-amd64:1.3gcr.io/google_containers/pause-amd64:3.0gcr.io/google_containers/etcd-amd64:2.2.5
weaveworks/weave-kube:1.7.2weaveworks/weave-npc:1.7.2
复制代码


Node 节点:


gcr.io/google_containers/kube-proxy-amd64:v1.4.0gcr.io/google_containers/pause-amd64:3.0weaveworks/weave-kube:1.7.2weaveworks/weave-npc:1.7.2
复制代码


查看镜像数量(Master 节点 10 个镜像 Node 节点 2 个镜像):


docker images|grep gcr.io|wc -l
复制代码

Setup1. 开始部署 Master 节点

这里以 K8S1 节点作为 Master 节点,执行下面的命令,完成 Master 部署:


ansible-playbook /vagrant/ansible/k8s-master.yml -c local
复制代码


日志信息:


[WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-master : Ensure kubeadm initialization] ******************************changed: [localhost]TASK [k8s-master : Ensure Network Start Script] ********************************ok: [localhost] => (item=start-weave)ok: [localhost] => (item=start-calico)ok: [localhost] => (item=start-canal)TASK [k8s-master : Ensure jq package is installed] *****************************skipping: [localhost] => (item=[])TASK [k8s-master : Ensure jq package is installed] *****************************changed: [localhost] => (item=[u'jq'])TASK [k8s-master : Set --advertise-address flag in kube-apiserver static pod manifest (workaround for https://github.com/kubernetes/kubernetes/issues/34101)] ***changed: [localhost]TASK [k8s-master : Set --cluster-cidr flag in kube-proxy daemonset (workaround for https://github.com/kubernetes/kubernetes/issues/34101)] ***changed: [localhost]TASK [k8s-master : firewalld] **************************************************changed: [localhost]TASK [k8s-master : firewalld] **************************************************changed: [localhost]TASK [k8s-master : command] ****************************************************changed: [localhost]PLAY RECAP *********************************************************************localhost                  : ok=9    changed=7    unreachable=0    failed=0
复制代码


生成的配置文件列表:


# 证书/etc/kubernetes/pki/apiserver-key.pem/etc/kubernetes/pki/apiserver.pem/etc/kubernetes/pki/apiserver-pub.pem/etc/kubernetes/pki/ca-key.pem/etc/kubernetes/pki/ca.pem/etc/kubernetes/pki/ca-pub.pem/etc/kubernetes/pki/sa-key.pem/etc/kubernetes/pki/sa-pub.pem/etc/kubernetes/pki/tokens.csv# Master 配置/etc/kubernetes/manifests/kube-scheduler.json/etc/kubernetes/manifests/kube-controller-manager.json/etc/kubernetes/manifests/kube-apiserver.json/etc/kubernetes/manifests/etcd.json# kubelet 配置/etc/kubernetes/admin.conf/etc/kubernetes/kubelet.conf#查看启动配置ps aux|grep kubelet #输出日志/usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=100.64.0.10 --cluster-domain=cluster.local --v=4
复制代码


由于 POD 网络未配置,kube-dns 未启动:


[root@k8s1 files]# kubectl get po --namespace=kube-systemNAME                             READY     STATUS              RESTARTS   AGEetcd-k8s1                        1/1       Running             0          5mkube-apiserver-k8s1              1/1       Running             3          5mkube-controller-manager-k8s1     1/1       Running             1          6mkube-discovery-982812725-uz406   1/1       Running             0          6mkube-dns-2247936740-s412w        0/3       ContainerCreating   0          6mkube-proxy-amd64-2228u           1/1       Running             0          2mkube-proxy-amd64-3um33           1/1       Running             0          6mkube-proxy-amd64-945s5           1/1       Running             0          2mkube-scheduler-k8s1              1/1       Running             1          5mweave-net-i4qk7                  2/2       Running             0          28sweave-net-k12m3                  2/2       Running             0          28sweave-net-vh456                  2/2       Running             0          28s
复制代码

Setup2. 添加 work 节点

k8s2/k8s3 设置为工作节点,执行下面的命令:
ansible-playbook /vagrant/ansible/k8s-worker.yml -c local [root@k8s2 ~]# ansible-playbook /vagrant/ansible/k8s-worker.yml -c local [WARNING]: provided hosts list is empty, only localhost is availablePLAY [localhost] ***************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [k8s-worker : Join Kubernetes Cluster] ************************************changed: [localhost]PLAY RECAP *********************************************************************localhost : ok=2 changed=1 unreachable=0 failed=0
复制代码


查看节点状态:


[root@k8s1 files]# kubectl get nodeNAME      STATUS    AGEk8s1      Ready     49mk8s2      Ready     45mk8s3      Ready     45m
复制代码

Setup3. 部署 Pod 网络

**Kubernetes 1.2 版本默认使用的是 flannel 网络,用于解决 POD 跨主机之间的通信。新版本未提供默认的网络插件,在部署应用集群之前,必须要配置 POD 网络。


未配置 POD 网络,默认的 KUBE-DNS 是无法启动的。这里使用 weave 网络方案,当然也可以使用 Calico 或 Canal。


在 Master 节点执行下面的命令安装 POD 网络:**


[root@k8s1 files]# pwd/vagrant/ansible/roles/k8s-master/files[root@k8s1 files]# ./start-weave
复制代码


查看部署 POD:


[root@k8s1 files]# kubectl get po --namespace=kube-systemNAME                             READY     STATUS    RESTARTS   AGEetcd-k8s1                        1/1       Running   0          54mkube-apiserver-k8s1              1/1       Running   3          55mkube-controller-manager-k8s1     1/1       Running   1          55mkube-discovery-982812725-uz406   1/1       Running   0          55mkube-dns-2247936740-s412w        3/3       Running   1          55mkube-proxy-amd64-2228u           1/1       Running   0          51mkube-proxy-amd64-3um33           1/1       Running   0          55mkube-proxy-amd64-945s5           1/1       Running   0          51mkube-scheduler-k8s1              1/1       Running   1          54mweave-net-i4qk7                  2/2       Running   0          49mweave-net-k12m3                  2/2       Running   0          49mweave-net-vh456                  2/2       Running   0          49m
复制代码


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/jLVF4hQ0J8DFMF1L5xXAdw


2020-03-13 19:00755

评论 1 条评论

发布
用户头像
作者的 Github 仓库是 3 年前的,这里有一篇更全面:https://github.com/kubernetes/kubernetes-anywhere

我最近也在尝试利用 Ansible 本地安装,但是方法不一样,碰到了 kubelet 在容器运行中的问题,我的仓库是:
https://github.com/caryyu/kubernetes-study/

2020-03-14 11:07
回复
没有更多了
发现更多内容

办公要有新享法,「MIAOYUN生活梦想家」焕新升级!

MIAOYUN

搬迁公告 乔迁 办公升级

EFCore之CodeFirst

青柚1943

ORM SqlServer NET6 EFCore

vue项目中babel的最佳实践

虎妞先生

前端 Vue 3 vue cli babel

活动推荐 | 博睿数据数智领航营火热报名中

博睿数据

保险 博睿数据 活动报名 数智领航营

家电类投诉高居榜首,拿什么拯救“投诉了个寂寞”的消费者?

Openlab_cosmoplat

工业互联网 开源社区 家电

DBA必备的Mysql知识点:数据类型和运算符

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

倒计时2天:百度“文心一言”即将上线!

引迈信息

人工智能 低代码 AIGC ChatGPT 文心一言

MySQL创建用户与授权

源字节1号

软件开发 前端开发 后端开发 小程序开发

关于服务器数据迁移,介绍在服务器数据迁移计划中的7个步骤

镭速

关于 SysOM 2.0 网络/存储相关诊断功能介绍及案例展示 | 第 72-73 期

OpenAnolis小助手

开源 直播 系统运维 技术分享 龙蜥大讲堂

工业数字孪生:西门子工业网络与设备虚拟调试案例

Openlab_cosmoplat

工业互联网 开源社区 数字孪生

2023主流系统 固资管理助力转型升级一步到位

加入高科技仿生人

低代码 企业数字化转型 资产管理

低代码平台怎么选?5大通用要素可以参考

这我可不懂

低代码 低代码平台 JNPF

我在京东做研发第五期:京东云自研服务器,如何将开发成本降低 60% 的同时还更低碳环保?

京东科技开发者

cpu 服务器 环保 节能 企业号 3 月 PK 榜

十问babel

虎妞先生

前端工程化 babel 前端‘’

Sugar BI 增强分析能力全场景解析

Baidu AICLOUD

BI

Seata-go 1.1.0 发布,补齐 AT 模式支持

SOFAStack

开源 互联网 开发者 开发 Seata框架

AREX-携程无代码侵入的自动化回归测试平台

AREX 中文社区

开源 自动化测试 回归测试

Rust的安全性和稳健型

非凸科技

【云原生】k8s 环境快速部署(一小时以内部署完)

Java你猿哥

Java 学习 k8s Spring Boot ssm

低代码平台的流程引擎设计指南

Baidu AICLOUD

低代码 爱速搭

为什么CMS和G1都改用三色标记法,是可达性分析不香吗?

Java全栈架构师

Java 程序员 后端 JVM 架构师

MQTT 5.0新特性:属性与载荷

EMQ映云科技

物联网 IoT mqtt 企业号 3 月 PK 榜 载荷

Spring Boot 集成 Liquibase,数据库也能做版本控制!

Java你猿哥

Java spring Spring Boot java 编程

3d建筑软件:Vectorworks 2023激活版

真大的脸盆

Mac Mac 软件 3D建筑动画

研发效能度量从 0 到 1 的『六脉神剑』

思码逸研发效能

研发效能 效能度量 研发效能度量

尚硅谷Node.js实战教程发布

小谷哥

2023 MacBook Pro 与2021 Macbook Pro有哪些差别

互联网搬砖工作者

MacBook M1芯片 MacBook Pro M2芯片

实践Pytorch中的模型剪枝方法

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜

DSC:数仓SQL脚本迁移的神奇工具

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

Tapdata Cloud 基础课:新功能详解之「授权系统自动分析」,一键定位任务报错原因,快速获取修复建议

tapdata

大数据

Ansible+Vagrant 本地部署 Kubernetes 1.4_行业深度_才云科技_InfoQ精选文章