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

前言

本篇部署教程将讲述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
注意,以上脚本使用阿里云镜像进行安装。

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

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

systemctl daemon-reload
systemctl enable kubelet

2.批量拉取k8s相关镜像

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

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

kubeadm config images list

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

#批量下载镜像
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官方镜像转换下。

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

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

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”来查看其将进行的一些步骤,了解了其动作,我们才能保障在安装的过程中处理起来游刃有余:

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

  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。

注意:静态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。

具体执行细节如下所示:

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

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

令牌是用于主节点和新添加的节点之间进行相互身份验证的,因此需要确保其安全,因为任何人一旦知道了这些令牌,就可以随便给集群添加节点。如果令牌过期了,我们可以使用 “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:

7.检查集群状态

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

kubectl get cs

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

kubectl get pods -n kube-system -o wide

如果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已过期,请参考后续章节的常见问题。这里,正常情况下加入成功后如下所示:

加入集成成功之后,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账户的密码:

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

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

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

5.查看集群节点状态

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

kubectl get nodes

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

安装仪表盘

命令如下所示:

#如果使用代理或者使用国际网络,则可跳过此步骤
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

创建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

使用命令得到token:

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

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

kubectl proxy

访问地址如下所示:

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

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

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

往期内容链接

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

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

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

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

使用kubectl管理k8s集群(二十九)

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

原文地址:https://www.cnblogs.com/codelove/p/11286812.html

时间: 2024-10-10 15:31:02

使用Kubeadm创建k8s集群之节点部署(三十一)的相关文章

[转帖]k8s集群node节点一直NotReady, 且node节点(并非master)的kubelet报错:Unable to update cni config: No networks found in /etc/cni/net.d

k8s集群node节点一直NotReady, 且node节点(并非master)的kubelet报错:Unable to update cni config: No networks found in /etc/cni/net.d http://www.voidcn.com/article/p-wpuagtbj-byy.html ? 考虑到node节点的kubelet报错Unable to update cni config: No networks found in /etc/cni/net.

Apache Hadoop集群离线安装部署(三)——Hbase安装

Apache Hadoop集群离线安装部署(一)--Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apache Hadoop集群离线安装部署(二)--Spark-2.1.0 on Yarn安装:http://www.cnblogs.com/pojishou/p/6366570.html Apache Hadoop集群离线安装部署(三)--Hbase安装:http://www.cnblogs.com/po

k8s集群新增节点

节点为centos7.4 一.node节点基本环境配置 1.配置主机名 2.配置hosts文件(master和node相互解析) 3.时间同步 ntpdate pool.ntp.org date echo '*/10 * * * * /usr/sbin/ntpdate pool.ntp.org' >>/var/spool/cron/root crontab -l 4.关闭防火墙和selinux systemctl stop firewalld systemctl disable firewal

用kubeadm安装k8s集群

1.准备 1.1系统配置 在安装之前,需要先做如下准备.三台CentOS主机如下: 配置yum源(使用腾讯云的) 替换之前先备份旧配置 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup centos各版本的源配置列表 centos5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/

centos7系统部署rancher2.x,并创建k8s集群

前言 一 本文目标: 1.部署rancher-server UI,版本:2.3.52.通过rancher部署一个k8s集群crystal-cluster3.在k8s集群crystal-cluster上部属nginx实例 二 部署的几个前提: 1.按照官方的要求,选择rancher版本对应支持的系统版本和docker版本:2.安装ntp,保证每一台服务器之间的时间同步,否则可能会出现证书验证错误的问题:3.关闭防火墙和selinux.(如果要开启防火墙,那么要在防火墙放行rancher所需的端口,

使用kubeadm安装k8s集群故障处理三则

最近在作安装k8s集群,测试了几种方法,最终觉得用kubeadm应该最规范. 限于公司特别的网络情况,其安装比网上不能访问google的情况还要艰难. 慢慢积累经验吧. 今天遇到的三则故障记下来作参考. 当然,所有方法都是看了log输出后,从网上搜索的方法. =============== Q,如何让kubeadm在安装过程中不联网? A:记得在kubeadm init过程中增加参数 --kubernetes-version=v1.7.0 Q,kubelet cgroup driver参数不一致

5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)

据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数量的容器和工作负载.在积累了这么多年的经验后,Google 决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益. 这个项目就是 Kubernetes.简单的讲,Kubernetes 是 Google Omega 的开源版本. 从 2014 年第一个版本发布以来,Kubernetes 迅

排查 k8s 集群 master 节点无法正常工作的问题

搭建的是 k8s 高可用集群,用了 3 台 master 节点,2 台 master 节点宕机后,仅剩的 1 台无法正常工作. 运行 kubectl get nodes 命令出现下面的错误 The connection to the server k8s-api:6443 was refused - did you specify the right host or port? 注:k8s-api 对应的就是这台 master 服务器的本机 IP 地址. 运行 netstat -lntp 命令发

RKE K8S 集群增删节点

rke 删除节点: 修改cluster.yal 将需要删除的节点配置删除,然后运行 [[email protected] rke]# more cluster.yml nodes: - address: 172.20.101.103 user: ptmind role: [controlplane,worker,etcd] - address: 172.20.101.104 user: ptmind role: [controlplane,worker,etcd] - address: 172.