使用kubeadm部署kubernetes集群

简介:

使用kubeadm部署kubernetes集群

通过docker,我们可以在单个主机上快速部署各个应用,但是实际的生产环境里,不会单单存在一台主机,这就需要用到docker集群管理工具了,本文将简单介绍使用docker集群管理工具kubernetes进行集群部署。


1 环境规划与准备

本次搭建使用了三台主机,其环境信息如下:
| 节点功能 | 主机名 | IP |
| ——————|:—————-:|——————-:|
| master | master |192.168.1.11 |
| slave1 | slave1 |192.168.1.12 |
| slave2 | slave2 |192.168.1.13 |

在三台主机的/etc/hosts文件中添加以下内容

vim /etc/hosts
#添加以下信息
192.168.1.11 master
192.168.1.12 slave1
192.168.1.13 slave2

关闭swap

swapoff -a

再把/etc/fstab文件中带有swap的行注释。


关闭SELinux

setenforce 0
vim /etc/sysconfig/selinux
#修改SELINUX属性
SELINUX=disabled

设置iptables

cat <<EOF >  /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
sysctl --system

安装socat等工具

yum install -y ebtables socat

2 kubernetes安装

2.1 安装docker

官方推荐安装docker版本为1.12

#yum安装docker
yum install -y docker
#设置docker开机启动
systemctl enable docker
#启动docker
systemctl start docker

验证docker版本

docker --version
#以下为输出的版本信息
Docker version 1.12.6, build 85d7426/1.12.6

2.2 安装kubectl、kubelet、kubeadm

2.2.1 添加yum源

常用yum源均没有这几个安装包,需要添加专门的yum源

cat <<EOF 
> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl= 
enabled=1
gpgcheck=0
EOF
#官方文档中的yum源为google,国内无法使用

2.2.2 安装kubectl、kubelet、kubeadm

yum install -y kubelet kubeadm kubectl

2.2.3 启动kubelet

#设置开机启动kubelet
systemctl enable kubelet
#启动kubelet
systemctl start kubelet

查询kubelet的状态

systemctl status kubelet

初次安装的情况下kubelet应未启动成功,我们会按下面的步骤初始化集群后会自动启动的。


3 kubernetes集群配置

3.1 master节点配置

3.1.1 初始化master

根据官方文档进行初始化:

kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr 10.244.0.0/16
#--apiserver-advertise-address 192.168.1.11为master节点IP,部分文档也指定为0.0.0.0
#--pod-network-cidr 10.244.0.0/16为pod网络cidr

出现如下错误:

[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
unable to get URL "https://storage.googleapis.com/kubernetes-release/release/stable-1.7.txt": 
Get https://storage.googleapis.com/kubernetes-release/release/stable-1.7.txt: net/http: TLS handshake timeout

需要指定kubernetes-version。

首先查询版本

kubeadm versionkubeadm version: &version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5",…………

版本为1.7.5,然后启动参数中加入版本:

kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr 10.244.0.0/16 --kubernetes-version=v1.7.5

3.1.2 master节点依赖镜像

执行过程中会卡在如下步骤:

[apiclient] Created API client, waiting for the control plane to become ready

因为kubenetes初始化启动会依赖某些镜像,而这些镜像默认会到google下载,我们需要手动下载下来这些镜像后再进行初始化。

使用CTRL+C结束当前进程,然后到/etc/kubernetes/manifests/目录下查看各个yaml文件,还有其他需要的镜像文件,汇总后如下:

gcr.io/google_containers/etcd-amd64:3.0.17
gcr.io/google_containers/kube-apiserver-amd64:v1.7.5
gcr.io/google_containers/kube-controller-manager-amd64:v1.7.5
gcr.io/google_containers/kube-scheduler-amd64:v1.7.5
gcr.io/google_containers/pause-amd64:3.0
gcr.io/google_containers/kube-proxy-amd64:v1.7.5
quay.io/coreos/flannel
gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4
gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4

因直接下载这些google镜像,下载不下来,我们通过下载dockerHUB/阿里云上的镜像,然后更改tag。

#etcd-amd64:3.0.17
docker pull sylzd/etcd-amd64-3.0.17
docker tag docker.io/sylzd/etcd-amd64-3.0.17:latest  gcr.io/google_containers/etcd-amd64:3.0.17
#kube-apiserver-amd64:v1.7.5
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-apiserver-amd64:v1.7.5
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-apiserver-amd64:v1.7.5  gcr.io/google_containers/kube-apiserver-amd64:v1.7.5
#kube-controller-manager-amd64:v1.7.5
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-controller-manager-amd64:v1.7.5
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-controller-manager-amd64:v1.7.5  gcr.io/google_containers/kube-controller-manager-amd64:v1.7.5
#kube-scheduler-amd64:v1.7.5
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-scheduler-amd64:v1.7.5
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-scheduler-amd64:v1.7.5   gcr.io/google_containers/kube-scheduler-amd64:v1.7.5
#pause-amd64:3.0
docker pull visenzek8s/pause-amd64:3.0
docker tag visenzek8s/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
#kube-proxy-amd64:v1.7.5
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.7.5
docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.7.5  gcr.io/google_containers/kube-proxy-amd64:v1.7.5
#quay.io/coreos/flannel
docker pull quay.io/coreos/flannel
#k8s-dns-kube-dns-amd64:1.14.4
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-kube-dns-amd64:1.14.4
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-kube-dns-amd64:1.14.4 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4
#k8s-dns-sidecar-amd64:1.14.4
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-sidecar-amd64:1.14.4
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-sidecar-amd64:1.14.4 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4
#k8s-dns-dnsmasq-nanny-amd64:1.14.4
docker pull mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.4
docker tag mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.4 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4

master节点初始化成功,结果如下:

Your Kubernetes master has initialized successfully!To start using your cluster,
 you need to run (as a regular user):  
 mkdir -p $HOME/.kube  
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
 You should now deploy a pod network to the cluster.Run 
 "kubectl apply -f [podnetwork].yaml" 
 with one of the options listed at: 
 http://kubernetes.io/docs/admin/addons/You can now join any number of machines 
 by running the following on each nodeas root:  kubeadm join --token 3f1db4.9f7ba7d52de40996 192.168.1.11:6443

需要记住kubeadm join --token这句,后面会用到


3.1.3 kubectl配置

#对于非root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#对于root用户
export KUBECONFIG=/etc/kubernetes/admin.conf

3.1.4 pod network配置

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安装完network之后,你可以通过kubectl get pods --all-namespaces来查看kube-dns是否在running来判断network是否安装成功。

kubectl get pods --all-namespaces
#运行正常的结果如下:
NAMESPACE     NAME     READY     STATUS    RESTARTS   AGEkube-system   etcd-localhost.localdomain      1/1       Running   0    1hkube-system   kube-apiserver-localhost.localdomain            1/1       Running   0          1hkube-system   kube-controller-manager-localhost.localdomain   1/1       Running   3          1hkube-system   kube-dns-2425271678-27g6v    3/3       Running   0      1hkube-system   kube-flannel-ds-1mjq3      1/1       Running   1          1hkube-system   kube-proxy-mtjwb        1/1       Running   0    1hkube-system   kube-scheduler-localhost.localdomain    1/1       Running   0     1h

如果以上STATUS中存在不是Running的需要再进行解决。

由于安全原因,默认情况下pod不会被schedule到master节点上,可以通过下面命令解除这种限制:

kubectl taint nodes --all node-role.kubernetes.io/master-

3.2 slave节点配置

3.2.1 slave节点依赖镜像

slave节点需要以下镜像:

gcr.io/google_containers/kube-proxy-amd64:v1.7.5
quay.io/coreos/flannel
gcr.io/google_containers/pause-amd64:3.0

在msater节点上导出镜像

docker save -o /opt/kube-pause.tar gcr.io/google_containers/pause-amd64:3.0
docker save -o /opt/kube-proxy.tar gcr.io/google_containers/kube-proxy-amd64:v1.7.5
docker save -o /opt/kube-flannel.tar quay.io/coreos/flannel

复制到slave主机/opt目录下,再导入即可:

docker load -i /opt/kube-flannel.tardocker load -i /opt/kube-proxy.tardocker load -i /opt/kube-pause.tar

3.2.2 slave节点加入集群

在两个slave节点上执行:

kubeadm join --token 3f1db4.9f7ba7d52de40996 192.168.1.11:6443

执行成功标志:

Node join complete:* Certificate signing request sent to master and response  received.* 
Kubelet informed of new secure connection details.Run 'kubectl get nodes' on the master to see this machine join.

在mster节点上执行kubectl get nodes查看是否成功:

kubectl get nodesNAME      STATUS    AGE       VERSIONmaster    Ready     56m       v1.7.5slave1    Ready     1m        v1.7.5slave2    Ready     1m        v1.7.5

可以看到,kubernetes集群已经部署成功,可以使用了。


参考资料

  1. Installing kubeadm,https://kubernetes.io/docs/setup/independent/install-kubeadm/

  2. 使用kubeadm在Red Hat 7/CentOS 7快速部署Kubernetes 1.7集群,http://dockone.io/article/2514

  3. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇),https://www.cnblogs.com/liangDream/p/7358847.html

  4. How to execute “kubeadm init” v1.6.4 behind firewall,https://stackoverflow.com/questions/44432328/how-to-execute-kubeadm-init-v1-6-4-behind-firewall

  5. 使用 kubeadm 创建 kubernetes 1.9 集群,https://www.kubernetes.org.cn/3357.html


如有疑问,欢迎交流



 本文转自 sjfbjs 51CTO博客,原文链接:http://blog.51cto.com/11886896/2072527
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
938 1
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
654 89
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
1279 9
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
存储 Kubernetes 异构计算
Qwen3 大模型在阿里云容器服务上的极简部署教程
通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1430 33
|
Kubernetes 开发者 微服务
简化Kubernetes应用部署工具-Helm之Hook
本文讲的是简化Kubernetes应用部署工具-Helm之Hook【编者的话】微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。
2922 0
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
987 19

推荐镜像

更多