使用Kubeadm创建k8s集群之节点部署(三十二)


640?wx_fmt=gif

前言         

由于上次忘开申明原创,特再发一次。

本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备。本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案。不过基于部署环境和k8s的复杂性,我们需要对k8s集群部署过程中的一些步骤都有所了解,尤其是kubeadm init命令。



目录


主节点部署 

  1. Kubeadm以及相关工具包的安装

  2. 批量拉取k8s相关镜像

  3. 使用“kubeadm init”启动k8s主节点

  4. 启动k8s主节点

  5. kubectl认证

  6. 安装flannel网络插件

  7. 检查集群状态

工作节点部署 

  1. 安装 kubelet

  2. 拉取相关镜像

  3. 使用“kubeadm join”将当前节点加入集群

  4. 复制admin.conf并且设置配置

  5. 查看集群节点状态

安装仪表盘 


主节点部署

当上述步骤完成后,我们依照以下步骤来完成主节点的安装:


1.Kubeadm以及相关工具包的安装


安装脚本如下所示:

#配置源	
echo '#k8s	
[kubernetes]	
name=Kubernetes	
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64	
enabled=1	
gpgcheck=0	
'>/etc/yum.repos.d/kubernetes.repo	
#kubeadm和相关工具包	
yum -y install kubelet kubeadm kubectl kubernetes-cni

注意,以上脚本使用阿里云镜像进行安装。


640

如果成功安装,会提示“完毕!”:

640

安装完成之后,需要重启kubelet:

systemctl daemon-reload	
systemctl enable kubelet


2.批量拉取k8s相关镜像


如果使用代理、国际网络或者指定镜像库地址,此步骤可以忽略。在国内,由于国际网络问题,k8s相关镜像在国内可能无法下载,因此我们需要手动准备。

首先,我们先使用“kubeadm config”命令来查看kubeadm相关镜像的列表:

kubeadm config images list

640

接下来我们可以从其他仓库批量下载镜像并且修改镜像标签:

#批量下载镜像	
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x	
#批量命名镜像	
docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's# mirrorgooglecontainers# k8s.gcr.io#2' |sh -x	
#批量删除mirrorgooglecontainers镜像	
docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x	
# coredns没包含在docker.io/mirrorgooglecontainers中	
docker pull coredns/coredns:1.3.1	
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1	
docker rmi coredns/coredns:1.3.1

注:coredns没包含在docker.io/mirrorgooglecontainers中,需要手工从coredns官方镜像转换下。


640

经过漫长的等待之后,如果镜像下载完成,我们可以执行命令“docker images”来查看本地镜像是否均已准备妥当:

640

东西都准备好了,接下来我们就可以来创建集群了。


3.使用“kubeadm init”启动k8s主节点


在前面,我们讲解过了“kubeadm init”命令可以用于启动一个Kubernetes主节点,语法如下所示:

kubeadm init [flags]

其中主要的参数如下所示:

可选参数

说明

--apiserver-advertise-address

指定API Server地址

--apiserver-bind-port

指定绑定的API Server端口,默认值为6443

--apiserver-cert-extra-sans

指定API Server的服务器证书

--cert-dir

指定证书的路径

--dry-run

输出将要执行的操作,不做任何改变

--feature-gates

指定功能配置键值对,可控制是否启用各种功能

-h, --help

输出init命令的帮助信息

--ignore-preflight-errors

忽视检查项错误列表,例如“IsPrivilegedUser,Swap”,如填写为 'all' 则将忽视所有的检查项错误

--kubernetes-version

指定Kubernetes版本

--node-name

指定节点名称

--pod-network-cidr

指定pod网络IP地址段

--service-cidr

指定service的IP地址段

--service-dns-domain

指定Service的域名,默认为“cluster.local”

--skip-token-print

不打印Token

--token

指定token

--token-ttl

指定token有效时间,如果设置为“0”,则永不过期

--image-repository

指定镜像仓库地址,默认为"k8s.gcr.io"

值得注意的是,如上所述,如果我们不想每次都手动批量拉取镜像,我们可以使用参数“--image-repository”来指定第三方镜像仓库,如下述命令所示:

kubeadm init --kubernetes-version=v1.15.0  --apiserver-advertise-address=172.16.2.201  --pod-network-cidr=10.0.0.0/16 --service-cidr 11.0.0.0/12 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

“kubeadm init”命令会执行系列步骤来保障启动一个k8s主节点,我们可以通过命令“kubeadm init --dry-run”来查看其将进行的一些步骤,了解了其动作,我们才能保障在安装的过程中处理起来游刃有余:

640

如上图所示,其主体常规步骤(部分步骤根据参数会有变动)如下:

  1. 确定Kubernetes版本。

  2. 预检。出现错误则退出安装,比如虚拟内存(swap)没关闭,端口被占用。出现错误时,请用心按照按照提示进行处理,不推荐使用“--ignore-preflight-errors”来忽略。

  3. 写入kubelet配置。

  4. 生成自签名的CA证书(可指定已有证书)。

  5. 将 kubeconfig 文件写入 /etc/kubernetes/ 目录以便 kubelet、controller-manager 和 scheduler 用来连接到 API server,它们每一个都有自己的身份标识,同时生成一个名为 admin.conf 的独立的kubeconfig文件,用于管理操作(我们下面会用到)。

  6. 为 kube-apiserver、kube-controller-manager和kube-scheduler生成静态Pod的定义文件。如果没有提供外部的etcd服务的话,也会为etcd生成一份额外的静态Pod定义文件。这些静态Pod的定义文件会写入到“/etc/kubernetes/manifests”目录(如下图所示),kubelet会监视这个目录以便在系统启动的时候创建这些Pod。

640


注意:静态Pod是由kubelet进行管理,仅存在于特定节点上的Pod。它们不能通过API Server进行管理,无法与ReplicationController、Deployment或DaemonSet进行关联,并且kubelet也无法对其健康检查。静态 Pod 始终绑定在某一个kubelet,并且始终运行在同一个节点上。


  1. 对master节点应用labels和taints以便不会在它上面运行其它的工作负载,也就是说master节点只做管理不干活。

  2. 生成令牌以便其它节点注册。

  3. 执行必要配置(比如集群ConfigMap,RBAC等)。

  4. 安装“CoreDNS”组件(在 1.11 版本以及更新版本的Kubernetes中,CoreDNS是默认的DNS服务器)和“kube-proxy”组件。


4.启动k8s主节点


根据前面的规划,以及刚才讲述的“kubeadm init”命令语法和执行步骤,我们使用如下命令来启动k8s集群主节点:

kubeadm init --kubernetes-version=v1.15.0  --apiserver-advertise-address=172.16.2.201  --pod-network-cidr=10.0.0.0/16 --service-cidr 11.0.0.0/16

其中,kubernetes version为v1.15.0,apiserver地址为172.16.2.201,pod IP段为10.0.0.0/16。

具体执行细节如下所示:

640

集群创建成功后,注意这一条命令需要保存好,以便后续将节点添加到集群时使用:

kubeadm join 172.16.2.201:6443 --token jx82lw.8ephcufcot5j06v7 \	--discovery-token-ca-cert-hash sha256:180a8dfb45398cc6c3addd84a61c1bd4364297da1e91611c8c46a976dc12ff17

令牌是用于主节点和新添加的节点之间进行相互身份验证的,因此需要确保其安全,因为任何人一旦知道了这些令牌,就可以随便给集群添加节点。如果令牌过期了,我们可以使用 “kubeadm token”命令来列出、创建和删除这类令牌,具体操作见后续的《集群异常解决方案》。


5.kubectl认证


集群主节点启动之后,我们需要使用kubectl来管理集群,在开始前,我们需要设置其配置文件进行认证。

这里我们使用root账户,命令如下所示:

#kubectl认证	
export KUBECONFIG=/etc/kubernetes/admin.conf

如果是非root账户,则需要使用以下命令:

# 如果是非root用户	
$ mkdir -p $HOME/.kube	
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config	
$ chown $(id -u):$(id -g) $HOME/.kube/config


6.安装flannel网络插件


这里我们使用默认的网络组件flannel,相关安装命令如下如下所示:

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

命令“kubectl apply”可以用于创建和更新资源,以上命令使用了网络路径的yaml来进行创建flanner:

640


7.检查集群状态


安装完成之后,我们可以使用以下命令来检查集群组件是否运行正常:

kubectl get cs

640

同时,我们需要确认相关pod已经正常运行,如下所示:

kubectl get pods -n kube-system -o wide

640

如果coredns崩溃或者其他pod崩溃,可参考后续章节的常见问题进行解决,请注意确保这些pod正常运行(Running状态)后再添加工作节点。

如果命名空间“kube-system”下的pod均正常运行,那么我们的主节点已经成功的启动了,接下来我们来完成工作节点的部署。



工作节点部署


这里我们以Node1节点为例进行安装。开始安装之前,请确认已经完成之前的步骤(设置主机、IP、系统、Docker和防火墙等)。注意主机名、IP等配置不要出现重复和错误。


1.安装 kubelet和kubeadm


kubelet是节点代理,而kubeadm则用于将当前节点加入集群。下面我们就开始进行安装,

安装命令如下所示:

#配置源	
echo '#k8s	
[kubernetes]	
name=Kubernetes	
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64	
enabled=1	
gpgcheck=0	
'>/etc/yum.repos.d/kubernetes.repo	
#kubeadm和相关工具包	
yum -y install kubelet kubeadm

重启kubelet:

systemctl daemon-reload	
systemctl enable kubelet


2.拉取相关镜像


请参考上面小节中的《批量拉取k8s相关镜像》,此处略过。


3.使用“kubeadm join”将当前节点加入集群


“kubeadm join”命令可以启动一个Kubernetes工作节点并且将其加入到集群,语法如下所示:

kubeadm join [api-server-endpoint] [flags]

使用“kubeadm join”就相对简单多了,这里,我们回到前面,找到使用“kubeadm init”启动主节点时打印出来的“kubeadm join”脚本进行执行:

kubeadm join 172.16.2.201:6443 --token jx82lw.8ephcufcot5j06v7 \	--discovery-token-ca-cert-hash sha256:180a8dfb45398cc6c3addd84a61c1bd4364297da1e91611c8c46a976dc12ff17

如未保存该命令或者token已过期,请参考后续章节的常见问题。这里,正常情况下加入成功后如下所示:

640

加入集成成功之后,k8s就会自动调度Pod,这时我们仅需耐心等待即可。


4.复制admin.conf并且设置配置


为了在工作节点上也能使用kubectl,而kubectl命令需要使用kubernetes-admin来运行,因此我们需要将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到工作节点相同目录下,这里推荐使用scp进行复制,语法如下所示:

#复制admin.conf,请在主节点服务器上执行此命令	
scp /etc/kubernetes/admin.conf {当前工作节点IP}:/etc/kubernetes/admin.conf

具体执行内容如下:

scp /etc/kubernetes/admin.conf 172.16.2.202:/etc/kubernetes/admin.conf	
scp /etc/kubernetes/admin.conf 172.16.2.203:/etc/kubernetes/admin.conf

复制时需要输入相关节点的root账户的密码:

640

复制完成之后,我们就可以设置kubectl的配置文件了,以便我们在工作节点上也可以使用kubectl来管理k8s集群:

#设置kubeconfig文件	
export KUBECONFIG=/etc/kubernetes/admin.conf	
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

至此,k8s工作节点的部署初步完成。接下来,我们需要以同样的方式将其他工作节点加入到集群之中。


5.查看集群节点状态


集群创建完成之后,我们可以输入以下命令来查看当前节点状态:

kubectl get nodes

640

接下来,我们可以开始按需安装仪表盘以及部署应用了。



安装仪表盘


命令如下所示:

#如果使用代理或者使用国际网络,则可跳过此步骤	
docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1	
docker tag mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1	
#安装仪表盘	
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

640

创建admin权限:	
echo '	
---	
apiVersion: v1	
kind: ServiceAccount	
metadata:	labels:	k8s-app: kubernetes-dashboard	name: kubernetes-dashboard-admin	namespace: kube-system	
---	
apiVersion: rbac.authorization.k8s.io/v1beta1	
kind: ClusterRoleBinding	
metadata:	name: kubernetes-dashboard-admin	labels:	k8s-app: kubernetes-dashboard	
roleRef:	apiGroup: rbac.authorization.k8s.io	kind: ClusterRole	name: cluster-admin	
subjects:	
- kind: ServiceAccount	name: kubernetes-dashboard-admin	namespace: kube-system' >kubernetes-dashboard-admin.rbac.yaml	kubectl create -f kubernetes-dashboard-admin.rbac.yaml

640

使用命令得到token:

#获取token名称	
kubectl -n kube-system get secret | grep kubernetes-dashboard-admin	
#根据名称拿到token	
kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-lphq4

640

接下来可以使用以下命令来访问面板:

kubectl proxy

640

访问地址如下所示:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

640

这里我们输入我们刚才得到的Token,登录之后如下所示:

640

我们可以通过仪表盘来查看节点信息:

640


往期内容


Docker+ Kubernetes已成为云计算的主流(二十六)

容器化之后如何节省云端成本?(二十七)

了解Kubernetes主体架构(二十八)

使用Minikube部署本地Kubernetes集群(二十九)

使用kubectl管理k8s集群(三十)

使用Kubeadm创建k8s集群之部署规划(三十一)


640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Trie:hdu 4825、1251、1247、Poj 3764

hdu 4825链接 题目意思很简单,就是要求最大异或值的数。 我们可以从二进制的最高位开始选择,不断的排除一些数。我们先假设存在某些数字的二进制数是与当前查找的数不一样的,我们进入这一部分数进行查找,以此重复,不断…

ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard

上一篇《K8S集群部署》中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完成可视化管理。本篇已加入了《.NET Core on K8S学习实践系列文章索引》&#…

02 | 健康之路 kubernetes(k8s) 实践之路 : 生产可用环境及验证

上一篇《 01 | 健康之路 kubernetes(k8s) 实践之路 : 开篇及概况 》我们介绍了我们的大体情况,也算迈出了第一步。今天我们主要介绍下我们生产可用的集群架设方案。涉及了整体拓补图,和我们采用的硬件配置,目前存在的问题等内容。遵循上一篇提…

[开源] .NETCore websocket 即时通讯组件---ImCore

ImCore 是一款 .NETCore 下利用 WebSocket 实现的简易、高性能、集群即时通讯组件,支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。开源地址:https://github.com/2881099/im ,求 star~~dotnet add package ImCoreIM服务端publ…

【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库

在这篇文章中,我展示了如何在 Linux 上构建针对 .NET Framework 版本的.NET项目,而不使用 Mono。通用使用微软新发布的 Mocrosoft.NETFramework.ReferenceAssemblies NuGet 包,您将不需要安装除 .NET Core SDK 之外的任何其他软件包&#xff…

DevOps书单:调研了101名专家,推荐这39本必读书籍

任何一个领域都遵循从新人到熟手,从熟手到专家的路径。在成长过程中,DevOps人经常会陷入没人带,没人管,找不到职业方向的迷茫。DevOps是在商业演进与企业协作的进化过程中诞生的一个全新职业,被很多人看成是一个“全栈…

面对人性,有的选择向左,有的向右

这里是Z哥的个人公众号每周五11:45 按时送达有时也会有感而发,来加个餐~我的第「84」篇原创敬上前天早上,在36kr看到一篇文章《一个负能量的人,可以轻易搞垮周围人的生活》,讲述了可能我们每个人身边都存在…

10分钟了解分布式CAP、BASE理论

CAP理论2000年7月,Eric Brewer教授提出CAP猜想;2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP;之后,CAP理论正式成为分布式计算领域的公认定理。CAP定律说的是在一个分布式计算机系统中,一致性&#x…

ASP.NET Core Web Api之JWT刷新Token(三)

本节我们进入JWT最后一节内容,JWT本质上就是从身份认证服务器获取访问令牌,继而对于用户后续可访问受保护资源,但是关键问题是:访问令牌的生命周期到底设置成多久呢?见过一些使用JWT的童鞋会将JWT过期时间设置成很长&a…

简单dfs序 + 树链剖分

树链剖分 DFS序 先来讲一讲DFS序是什么东西,直接上图,方便理解。 估计巨巨们应该知道了DFS序的两个重要的东西,in,outin,outin,out数组。 ininin数组就是这个点进入DFS的时间。outoutout数组就是这个点退出DFS递归栈的时间。这个时间要注意…

WeihanLi.Npoi 导出支持自定义列内容啦

WeihanLi.Npoi 导出支持自定义列内容啦Intro之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求&#xff0c;起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导入导出的简单化&#xff0c;使用这个扩展导出的 Excel/csv 可以直接导入成 List<TEntity>&a…

让 .Net 更方便的导入导出 Excel

让 .Net 更方便的导入导出ExcelIntro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xl…

最大流,最小费用最大流:解析 + 各种板子

网络流初步 Edmond-Karp算法 网络流的基本概念 源点&#xff0c;这个点只有流量的流出&#xff0c;没有流入。汇点&#xff0c;这个点只有流量的流入&#xff0c;没有流出。容量&#xff0c;每条有向边的最大可承受的流的理论大小。流量&#xff0c;每条有向边的最大可承受的…

Zend创始人离职原来早已安排好

前边我们报导过&#xff0c;PHP 兼 Zend 公司联合创始人 Zeev Suraski 宣布目前已经从工作了 20 年的 Zend 公司离职。2 日晚间&#xff0c;知名 PHP 开发者&#xff0c;同时也是 PHP JIT 主力鸟哥&#xff08;惠新宸&#xff09;在朋友圈中曝出猛料&#xff1a;原来一切都是安…

梯度下降:求线性回归

梯度下降的直线拟合 实现说明 给定若干个x,yx, yx,y并且求得一个最佳的yaxby ax byaxb&#xff0c;也就是二元一次方程组的解。 先放上给定的散点&#xff0c;以及求得的线性回归的直线的图片。 我个人认为&#xff0c;这里的梯度优化&#xff0c;就是通过一个关键式子los…

3分钟了解数据库事务

事务是由几个读取和修改数据的sql命令组成的&#xff0c;但是知道commit命令被执行之后&#xff0c;修改操作才被认为是正常的完成。显式事务常以Begin tran语句开头&#xff0c;以commit tran或者rollback tran语句结尾的。事务具有acid属性原子性&#xff08;atomicity&#…

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient&#xff0c;开源社区创建了另一个名为RestSharp的库。如此多的http库&#xff0c;该怎样选择呢&#xff1f;01HttpWebRequest这是.NET创建者最初开发用于使用HTTP请求的标准类。…

.NetCore 2.1以后的HttpClient最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能&#xff0c;它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。01介绍在.NETCore平台的2.1新增了HttpClientFactory&#xff0c;虽然HttpClient这个类实现了disposable&…

点分治(简要讲解 + 模板)

树上点分治 思想 两个点之间的距离无非就是两种关系&#xff1a;我们约定dis[i]dis[i]dis[i]表示这个点到当前根节点的距离 dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个根节点的不同子树上。dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个棵子…

在 alpine 中使用 NPOI

在 alpine 中使用 NPOIIntro在 .net 中常使用 NPOI 来做 Excel 的导入导出&#xff0c;NPOI 从 2.4.0 版本开始支持 .netstandard2.0&#xff0c;在 dotnet core 应用也可以用 DotNetCore.NPOI。对于 .NET Core 应用来说&#xff0c;如果没有特殊的需求&#xff0c;alpine 是最…