写点什么

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:00907

评论 1 条评论

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

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

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

淘宝商品详情API接口:商品属性与评论数据综合获取,助力市场研究

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

AI 克隆声音,只需 3 分钟(附最全教程)

阿里巴巴云原生

阿里云 AI 云原生 函数计算

今日分享丨点亮这四个技能,你也可以成为可视化专家

inBuilder低代码平台

设计 设计开发

中国首例!「DataKit」上架亚马逊云科技 Marketplace add-ons

观测云

AWS

构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛

阿里巴巴云原生

阿里云 微服务 云原生

解决 JMeter 返回内容中文乱码问题的详细指南

霍格沃兹测试开发学社

2024青岛国际软件及信息技术博览会(CICE电博会)

AIOTE智博会

软件博览会 软件展会 软件展 软件展览会

京东商品详情API:解锁电商数据的金钥匙

Noah

MES系统适用于哪些行业?MES系统具体功能有哪些?

万界星空科技

mes 万界星空科技 离散型制造业 流程型制造业

AR巡点检系统:慧眼智巡,未来视界

AR玩家

AR Rokid Vision pro 炬目AR AR巡点检

抑制告警风暴,我们可以做些什么

乘云数字DataBuff

云原生 可观测 告警风暴

《SelectDB 新一代日志存储分析平台解决方案》白皮书重磅发布|立即下载

SelectDB

大数据 数据分析 实时数仓 解决方案 日志处理

如何使用JavaScript实现在线Excel附件的上传与下载?

不在线第一只蜗牛

JavaScript Excel

分享一些关于2024下半年AI发展的预测

澳鹏Appen

人工智能 预测 大模型 未来技术趋势 AI趋势

SD-WAN远程监控异地组网方案

Ogcloud

SD-WAN 远程监控 企业组网 SD-WAN组网 异地组网

小程序与小组件技术和场景介绍解析

Onegun

小程序 finclip 小程序组件

淘宝、1688海外站与外贸站搭建:全面解析与代购系统源码探讨

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

技术加持、产品立身“商查利器”爱企查持续助力诚信社会建设

科技热闻

云原生技术实践营 · 深圳站:Serverless + AI 专场开启报名!

阿里巴巴云原生

阿里云 Serverless AI 云原生

为什么选择SD-WAN进行企业异地组网?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 异地组网 SDWAN

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