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
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
end
end
启动虚拟机
vagrant up
//进入虚拟机环境
vagrant ssh k8s1
vagrant ssh k8s2
vagrant ssh k8s3
#切换超级用户
su
#关闭 SE
setenforce 0
#关闭 firewalld
systemctl stop firewalld && systemctl disable firewalld
#进入三台虚拟机,更改 IP 地址为静态方式
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
BOOTPROTO=static
#重启网络服务,使三台机器可以两两互通
systemctl restart network
将此文件 yum.repo 复制到 /etc/yum.repo.d/ 目录,准备 Kubernetes 安装的软件包。
cp yum.repo /etc/yum.repo.d/
#yum.repo
[base]
name=base-repo
baseurl=http://yum.caicloud.com/base/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[epel]
name=epel-repo
baseurl=http://yum.caicloud.com/epel/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[extras]
name=extras-repo
baseurl=http://yum.caicloud.com/extras/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[kubernetes]
name=kubernetes-repo
baseurl=http://yum.caicloud.com/kubernetes/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
[updates]
name=updates-repo
baseurl=http://yum.caicloud.com/updates/
enabled=1
gpgcheck=0
gpgkey=http://yum.caicloud.com/Centos7Base/RPM-GPG-KEY-CentOS-7
开始 Ansible 部署
vagrant ssh k8s1
vagrant ssh k8s2
vagrant 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 available
PLAY [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.0
docker pull registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0
docker pull registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0
docker pull registry.51yixiao.com/google_containers/kubedns-amd64:1.7
docker pull registry.51yixiao.com/google_containers/exechealthz-amd64:1.1
docker pull registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3
docker pull registry.51yixiao.com/google_containers/pause-amd64:3.0
docker 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.0
docker tag registry.51yixiao.com/google_containers/kube-proxy-amd64:v1.4.0 gcr.io/google_containers/kube-proxy-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-apiserver-amd64:v1.4.0 gcr.io/google_containers/kube-apiserver-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-scheduler-amd64:v1.4.0 gcr.io/google_containers/kube-scheduler-amd64:v1.4.0
docker tag registry.51yixiao.com/google_containers/kube-discovery-amd64:1.0 gcr.io/google_containers/kube-discovery-amd64:1.0
docker tag registry.51yixiao.com/google_containers/kubedns-amd64:1.7 gcr.io/google_containers/kubedns-amd64:1.7
docker tag registry.51yixiao.com/google_containers/exechealthz-amd64:1.1 gcr.io/google_containers/exechealthz-amd64:1.1
docker tag registry.51yixiao.com/google_containers/kube-dnsmasq-amd64:1.3 gcr.io/google_containers/kube-dnsmasq-amd64:1.3
docker tag registry.51yixiao.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
docker 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.2
docker 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.2
docker tag registry.51yixiao.com/weaveworks/weave-npc:1.7.2 weaveworks/weave-npc:1.7.2
Master 节点:
gcr.io/google_containers/kube-controller-manager-amd64:v1.4.0
gcr.io/google_containers/kube-proxy-amd64:v1.4.0
gcr.io/google_containers/kube-apiserver-amd64:v1.4.0
gcr.io/google_containers/kube-scheduler-amd64:v1.4.0
gcr.io/google_containers/kube-discovery-amd64:1.0
gcr.io/google_containers/kubedns-amd64:1.7
gcr.io/google_containers/exechealthz-amd64:1.1
gcr.io/google_containers/kube-dnsmasq-amd64:1.3
gcr.io/google_containers/pause-amd64:3.0
gcr.io/google_containers/etcd-amd64:2.2.5
weaveworks/weave-kube:1.7.2
weaveworks/weave-npc:1.7.2
Node 节点:
gcr.io/google_containers/kube-proxy-amd64:v1.4.0
gcr.io/google_containers/pause-amd64:3.0
weaveworks/weave-kube:1.7.2
weaveworks/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 available
PLAY [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-system
NAME READY STATUS RESTARTS AGE
etcd-k8s1 1/1 Running 0 5m
kube-apiserver-k8s1 1/1 Running 3 5m
kube-controller-manager-k8s1 1/1 Running 1 6m
kube-discovery-982812725-uz406 1/1 Running 0 6m
kube-dns-2247936740-s412w 0/3 ContainerCreating 0 6m
kube-proxy-amd64-2228u 1/1 Running 0 2m
kube-proxy-amd64-3um33 1/1 Running 0 6m
kube-proxy-amd64-945s5 1/1 Running 0 2m
kube-scheduler-k8s1 1/1 Running 1 5m
weave-net-i4qk7 2/2 Running 0 28s
weave-net-k12m3 2/2 Running 0 28s
weave-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 available
PLAY [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 node
NAME STATUS AGE
k8s1 Ready 49m
k8s2 Ready 45m
k8s3 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-system
NAME READY STATUS RESTARTS AGE
etcd-k8s1 1/1 Running 0 54m
kube-apiserver-k8s1 1/1 Running 3 55m
kube-controller-manager-k8s1 1/1 Running 1 55m
kube-discovery-982812725-uz406 1/1 Running 0 55m
kube-dns-2247936740-s412w 3/3 Running 1 55m
kube-proxy-amd64-2228u 1/1 Running 0 51m
kube-proxy-amd64-3um33 1/1 Running 0 55m
kube-proxy-amd64-945s5 1/1 Running 0 51m
kube-scheduler-k8s1 1/1 Running 1 54m
weave-net-i4qk7 2/2 Running 0 49m
weave-net-k12m3 2/2 Running 0 49m
weave-net-vh456 2/2 Running 0 49m
本文转载自才云 Caicloud 公众号。
原文链接:https://mp.weixin.qq.com/s/jLVF4hQ0J8DFMF1L5xXAdw
更多内容推荐
手把手教你搭建 Kubernetes 1.4 集群
Kubernetes 1.4 的新功能是引入了 kubeadm 部署机制(暂时还是 alpha 版本)
500 代码行代码手写 docker- 设置网络命名空间
本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。
2023-05-29
【云原生 | 从零开始学 Docker】八丶 Docker 网络与部署 redis 集群
如何用名字而不用ip来访问容器,这个时候就要使用--link了!因为上篇文章我们启动了两台tomcat,这里我们直接用这两台机子来测试一下。
2022-09-18
为啥 Underlay 才是容器网络的最佳落地选择
导语:内外直通的Underlay网络才是容器网络的正确打开方式。
2020-07-21
深入浅出 Kubernetes 理论篇 (二):网络详解
简介:阿里云Kubernetes集群网络目前有两种方案,一种是flannel方案,另外一种是基于calico和弹性网卡eni的terway方案。
Kind:用于测试 Kubernetes 的本地集群
Kind 是一种使用 Docker 容器作为 node 节点,运行本地 Kubernetes 集群的工具
7. Kubernetes 中如何使用 Go 语言
2023-09-26
让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
在容器的生产实践中,偏小的容器镜像能够很快地部署启动。当应用的镜像达到几个 GB 以上的时候,在节点上下载镜像通常会消耗大量的时间。Dragonfly 通过引入 P2P 网络有效提升了容器镜像大规模分发的效率。然而,用户还是必须等待镜像数据完整下载到本地,然
2020-11-04
容器海洋中的舵手:Kubernetes 工作机制
这节课,让我们来看看Kubernetes的基本原理。
2023-02-09
解放开发者!3 款工具实现快速 K8S 开发
在这篇文章中,我们将探讨开发人员如何使用DevSpace和Rancher来简化Kubernetes开发。
Docker 出局?你还有 iSula、Containerd 和 CRI-O
K8s 抛弃 Docker?iSula、Containerd和CRI-O也很香。
使用 Ansible 部署 Elasticsearch 集群
Elasticsearch 是一款开源的分布式搜索和分析引擎,我们可以在其中存储海量的数据并且快速地进行搜索,然而部署 Elasticsearch 集群的过程耗时且繁琐,好在 Elasticsearch 官方为我们提供了 Ansible Playbook 方便我们快速部署 Elasticsearch 集群。ansible-
2021-10-08
FabEdge V0.5.0 新特性:支持跨集群服务访问
3月21日,FabEdge 正式发布了 V0.5 版本,该版本在 V0.4 的基础上,针对集群间访问的需求,新增了 FabDNS 组件,实现了对跨集群服务访问功能的支持。
2022-03-29
50|不可阻挡的容器化:Docker 核心技术与原理
这节课,我们来看看容器化技术,并利用Docker将我们的程序打包为容器。
2023-02-04
立于山巅!他,凭什么抗住万亿级流量冲击!
在云计算时代浪潮下,大规模、高并发的技术架构已成为主流。云计算的高速发展,离不开底层基础设施的创新与改进,传统七层负载均衡架构已无法满足复杂的网络集群。
2021-08-24
53|容器化实战:怎样搭建 K8s 爬虫集群?
这节课让我们把爬虫项目相关的微服务部署到 Kubernetes 中。
2023-02-11
6.Docker-compose
2023-09-30
多容器部署:如何利用 Docker Compose 快速搭建本地爬虫环境?
这节课,我们一起来学习如何使用 Docker Compose 来部署多个容器。
2023-02-07
微众银行正式开源容器平台 Dockin
Dockin是微众银行开源的生产级容器平台,提供了一整套私有云容器化的落地方案。
Rancher × Apache APISIX:极速部署更好用的开源网关和 Ingress Controller
本文将介绍如何在 Rancher 应用商店(Catalog)中安装和部署 Apache APISIX 和Apache APISIX Ingress Controller,进而如何通过它们代理 Kubernetes 服务。
2021-07-26
推荐阅读
WorkPlus 本地部署即时通讯,为企业打造高效安全的沟通平台
2023-09-22
实例讲解看 nsenter 带你“上帝视角”看网络
2023-07-06
NFT 艺术品交易所系统开发 [定制部署,1 周上线]
2023-09-24
使用 Appilot 部署 Llama2,会聊天就行!
2023-11-03
33|环境:基于 GraalVM 的 JVM 云原生环境搭建
2023-11-13
35|实现:基于 JDK 17、Spring Boot 3、Spring 6 打造云原生 Java 应用
2023-11-17
加餐|尝鲜 Gateway API:更强大、更灵活、面向未来的 Ingress
2023-11-20
电子书
大厂实战PPT下载
换一换 宋一玮 | FreeWheel 中国研发前端架构师 《现在 React web 应用开发实在课》专栏作者
宜博 | 宜创科技 创始人兼 CEO、TGO 鲲鹏会北京董事、鲲鹏会 AGI 小组发起人
刘鸣谦 | 卫宁健康 研发总监
评论 1 条评论