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

Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e971e971e97取模。 n≤1e5,a≤2e5,q≤1e5n\le1e5,a\le2e5,q\le1e5n≤1e5,a≤2e5,…

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

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

字符Hash初步

兔子与兔子 很久很久以前,森林里住着一群兔子。 有一天,兔子们想要研究自己的 DNA 序列。 我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。 然后我们每次选择两个区间&…

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

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

NWERC 2018 C. Circuit Board Design 树 + 构造

传送门 文章目录题意:思路:题意: 给你一颗nnn个点的树,让你在二维平面中构造一颗树,保证相邻点的距离正好为111,并且线段不能有相交,坐标绝对值≤3e3\le3e3≤3e3。 n≤1e3n\le1e3n≤1e3 思路&…

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

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

算法竞赛进阶指南——后缀数组

后缀数组 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围。 在本题中,我们希望使用快排、Hash与二分实现一个简单的O(nlog2n)的后缀数组求法。 详细地说,给定一个长度为 n 的字符串S&a…

NWERC 2018 A. Access Points 二维转一维 + 单调栈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你平面上nnn个点&#xff0c;你需要对于1−n1-n1−n依次选择nnn个点作为每个点的终点&#xff0c;满足选择的点i<j,xi≤xj,yi≤yji<j,x_i\le x_j,y_i\le y_ji<j,xi​≤xj​,yi​≤yj​&#xff0…

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

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

hdu 5023 线段树染色问题

题目链接 A Corrupt Mayor’s Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 4094 Accepted Submission(s): 1418 Problem Description Corrupt governors always find ways to get dirty money…

Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 有nnn个细胞&#xff0c;你初始在第nnn细胞上&#xff0c;假设你当前在xxx处&#xff0c;你每次可以进行如下两个操作&#xff1a; (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一个数yyy&#xff0c;跳到第x−yx-yx−y个细胞…

poj 2528 线段树离散化+染色

题目链接 Mayor’s posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 26452 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral pos…

Codeforces Round #740 (Div. 2) E. Bottom-Tier Reversals 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为奇数nnn的排列aaa&#xff0c;每次可以选择长度为奇数的前缀&#xff0c;并将[1,len][1,len][1,len]翻转&#xff0c;你需要用不超过5n2\frac{5n}{2}25n​次操作将其变成有序的&#xff0c;输…

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

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

模板:Prime最小生成树堆优化 + Dijkstra单源最短路堆优化

Dijkstra 单源最短路堆优化 #include<bits/stdc.h> using namespace std; typedef pair<int, int> PII; const int N 2e5 10; int head[N], to[N], value[N], nex[N], cnt 1; int n, m, rt, st, dis[N], visit[N]; struct cmp {bool operator()(PII a, PII b) …

Gym - 102001K Boomerangs 构造 + 三元环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一张nnn个点mmm条边的简单图&#xff0c;让你找出尽可能多的三元环&#xff0c;要求每个三元环都不能共边&#xff0c;输出三元环数量和具体是那个。 n,m≤1e5n,m\le1e5n,m≤1e5 思路&#xff1a; 其实…

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

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

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

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

2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个串&#xff0c;字符集是a−za-za−z&#xff0c;让你在每个串种选择一个子序列&#xff0c;保证对于i<j,si<sji<j,s_i<s_ji<j,si​<sj​&#xff0c;也就是选择的串字典序是严格…