K8s - Kubernetes集群的安装部署教程(CentOS系统)

本文演示如何搭建一个三节点的 Kubernetes Cluster 集群(一个 master 节点和两个 node 节点),并且这三台服务器使用的都是 CentOS 7 系统。

一、准备工作(三个节点都需要设置)

1,安装 Docker

所有的节点都需要安装 Docker,具体步骤可以参考我之前写的文章:

2,安装 kubelet、kubeadm 和 kubectl

(1)我们需要在所有节点上安装 kubelet、kubeadm 和 kubectl,它们作用分别如下:

  • kubeadm:用来初始化集群(Cluster)
  • kubelet:运行在集群中的所有节点上,负责启动 pod 和 容器。
  • kubectl:这个是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

(2)依次执行下面命令进行安装这三个工具(为避免出现“网络不可达”错误,这里将谷歌的镜像换成国内镜像):

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg[http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg](http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg)

exclude=kube*

EOF

# 将 SELinux 设置为 permissive 模式(将其禁用)

setenforce 0

sed -i ``'s/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable kubelet && systemctl start kubelet

3,修改 sysctl 配置

对于 RHEL/CentOS 7 系统,可以会由于 iptables 被绕过导致网络请求被错误的路由。所以还需执行如下命令保证 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1。

(1)使用 vi 命令编辑相关文件:
vi /etc/sysctl.conf

(2)在文件中添加如下内容后,保存退出。

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

(3)最后执行如下命令即可:

sysctl --system

4,关闭 swap

(1)首先执行如下命令将其关闭:

swapoff -a

(2)接着编辑 /etc/fstab 文件。
vi /etc/fstab
(3)将 /dev/mapper/centos-swap swap swap default 0 0 这一行前面加个 # 号将其注释掉。

(4)编辑完毕后保存退出。这样机器重启后 swap 便不会又自动打开了。

二、Master 节点的安装配置

1,初始化 Master

(1)我们在 Master 上执行如下命令进行初始化:

注意:--pod-network-cidr=10.244.0.0/16 是 k8s 的网络插件所需要用到的配置信息,用来给 node 分配子网段。然后我们这边用到的网络插件是 flannel,就是这么配。
kubeadm init --pod-network-cidr=10.244.0.0/16
(2)初始化的时候 kubeadm 会做一系列的校验,以检测你的服务器是否符合 kubernetes 的安装条件,检测结果分为 [WARNING] 和 [ERROR] 两种。其中 [ERROR] 部分要予以解决。

image.png

(3)比如上图我这里检测到三个 error:

  • Master 节点需要至少两核 CPU:由于我用的是虚拟机,关机后更改下虚拟机配置即可。
  • bridge-nf-call-iptables 这个参数,需要设置为 1:如果我们前面做了准备工作里的第三步,就不会有这个问题了。
  • swap 需要关闭:执行 swapoff -a 将其关闭即可。

(4)所有 error 解决后,再执行最开始的 init 命令后 kubeadm 就开始安装了。但通常这时还是会报错,这是因为国内 gcr.io无法访问(谷歌自己的容器镜像仓库),造成镜像下载不下来。

(5)我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,比如第一个 k8s.gcr.io/kube-apiserver:v1.14.1 镜像,可以执行如下命令从阿里云下载:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.1

(6)镜像下载下来以后再通过 docker tag 命令将其改成kudeadm安装时候需要的镜像名称。
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.1 k8s.gcr.io/kube-apiserver:v1.14.1
(7)其它缺失的镜像也依照上面步骤进行操作。
(8)镜像全部下载完毕后,再执行最开始的 init 命令后 kubeadm 就能成功安装了。最后一行,kubeadm 会提示我们,其他节点需要加入集群的话,只需要执行这条命令就行了,同时里面包含了加入集群所需要的 token(这个要记下来)。

2,配置 kubectl

kubectl 是管理 Kubernetes 集群的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化安装完后需要做一些配置工作,然后 kubectl 就能使用了。
(1)具体操作就依照前面 kubeadm init 输出的第一个红框内容。这里推荐使用使用普通用户执行 kubectl(root 会有一些问题),首先我们新建个普通用户 hangge,具体方法可以参考我之前写的文章:

(2)切换成 hangge 用户
su - hangge
(3)依次执行如下命令(即前面 kubeadm init 输出的第一个红框内容),为 hangge 用户配置 kubectl:
mkdir -p ``$HOME``/.kube

sudo cp -i /etc/kubernetes/admin.conf ``$HOME``/.kube/config

sudo ``chown $(id -u):$(id -g) ``$HOME``/.kube/config
(4)为了使用更加便捷,启用 kubectl 命令的自动补全功能。

echo "source <(kubectl completion bash)" >> ~/.bashrc

3,安装 Pod 网络

要让 Kubernetes 集群能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。(即前面 kubeadm init 输出的第二个红框内容)

Kubernetes 支持多种网络方案,这里我们使用 flannel。执行如下命令即可部署 flannel:

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

4,开放端口

分别执行下面两条命令配置 firewall 防火墙策略,开放相关端口:
firewall-cmd --permanent --add-port=6443/tcp

firewall-cmd --permanent --add-port=2379/tcp

firewall-cmd --permanent --add-port=2380/tcp

firewall-cmd --permanent --add-port=10250/tcp

firewall-cmd --permanent --add-port=10251/tcp

firewall-cmd --permanent --add-port=10252/tcp

firewall-cmd --reload

三、Node 节点的安装配置

1,添加节点

(1)在两个 node 节点上分别执行如下命令(即前面 kubeadm init 输出的最后一个红框内容),将其注册到 Cluster 中:

kubeadm join 192.168.60.128:6443 --token w5ndme.t66qlcrcw6l2j1k6 --discovery-token-ca-cert-hash sha256:890270a05467595010abc74718a53d95b13f0ba337a350ed4c52b1edcd47c2e8

(2)显示如下内容则说明节点添加成功:

2,安装镜像

(1)在每一个 node 节点上我们还需要下载 quay.io/coreos/flannel:v0.11.0-amd64、k8s.gcr.io/pause 和 k8s.gcr.io/kube-proxy 这三个镜像,其中后面两个镜像具体版本可以执行kubeadm config images list 查看一下:

image.png

(2)由于网络问题,后面两个镜像可能没法自动下载下来(第一个可以直接下载)。我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,再通过 docker tag 命令将其改成kudeadm 需要的镜像名称。

docker pull quay.io/coreos/flannel:v0.11.0-amd64

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.1

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.1 k8s.gcr.io/kube-proxy:v1.14.1

3,开放端口

10250 端口是一定要开放的,如果控制节点也要运行容器,也需要开启对应的端口(30000-32767)

firewall-cmd --permanent --add-port=10250/tcp

firewall-cmd --reload

四、查看节点状态

(1)在 master 节点上执行 kubectl get nodes 查看节点状态:

(2)目前 node 节点还处于 NotReady 状态,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,需要首先从 Google 下载镜像。

(3)我们可以通过如下命令查看 Pod 状态。CrashLoopBackOff、ContainerCreating、Init:0/1 等都表明 Pod 没有就绪,只有 Running 才是就绪状态。

kubectl get pod --all-namespaces

(4)我们也可以通过 kubectl describe pod <Pod Name> 查看 Pod 的具体情况,比如我们查看 kube-proxy-96bz6 这个 Pod 目前为何还没就绪。

kubectl describe pod kube-proxy-96bz6 --``namespace``=kube-system

(5)结果如下,是由于下载 image 时失败。这个可能是网络问题,我们可以继续等待,因为 Kubernetes 会自动重试。当然我们也可以自己手动执行 docker pull 去下载这个镜像。

注意:不一定都是 Master 节点下载镜像失败,还有可能是 node 节点上下载镜像失败,具体是哪里可以看前面部分信息。比如这里的 k8s.gcr.io/pause:3.1 就是 node 节点上没下载下来。

(6)当所有的 Pod 都处于 Running 状态后,可以发现所有的节点也就准备好了。至此 Kubernetes集群创建成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容