Skip to main content

Command Palette

Search for a command to run...

CentOS 7 + Kubernetes 1.1.x + Docker 1.9.x 安装指南

Updated
2 min read

前言

DockerKubernates最近可以说红的发紫,各种大部头和高深研究也层出不穷。

学习过程中看了官网和社区提供的不少起步文档,但是手工半手工这一块,总感觉语焉不详,操作性不很好,因此就边学边记,整理成这么一篇东西,本文只涉及操作,理论、架构、前景等内容,还请读者自行翻阅相关材料。

注意这里按照我的个人习惯,会把所有可执行文件复制到 /usr/local/share,并链接到 /usr/local/bin;环境配置文件统一放置到 /etc/sysconfig/kubernetes 中,这个做法跟手工安装一样,纯属个人恶趣味,没什么具体理由。

环境准备

这里我们使用的是 CentOS 7 为例子。

接下来内容里面会使用 A, B 两台服务器:

  • 服务器 A

    • IP: 10.211.55.12

    • 职责

      • Kubernate Master

      • Docker Private Registry

      • Kubernate Master UI

      • Kubernate Node

      • ETCD

  • 服务器 B

    • IP: 10.211.55.13

    • 职责

      • Kubernate Node

ETCD (仅 Master 需要)

可以简单理解为,用来管理容器 IP 的数据库。

Github 地址

使用 Yum 直接安装:

yum install -y etcd;

注意:安装后需要修改 /etc/etcd/etcd.conf,将其中的监听地址由 127.0.0.1 改为 0.0.0.0 或者其他 Node 可以访问的地址。

# 启动服务
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd

# 为后续服务提供初始值
etcdctl mk /docker.intranet/network/config '{"Network":"192.168.0.0/16"}'

Flannel (所有服务器都需要)

对前面的 ETCD 有依赖,这里利用这一服务来为 Docker 提供网络分配和部分网络参数生成的任务。

yum install -y flannel

接下来编辑配置文件 /etc/sysconfig/flanneld,将其中的 FLANNEL_ETCD 地址修改为之前我们配置的地址,并修改 FLANNEL_ETCD_KEY 为我们使用 etcdctl 设置的值,上文中是 "docker.intranet"

# 启动服务
systemctl daemon-reload
systemctl enable flanneld
systemctl start flanneld

Kubernates Master

下载和安装

首先下载压缩包,并复制其中需要的文件,然后做符号链接到习惯位置。

wget https://github.com/kubernetes/kubernetes/releases/download/v1.1.3/kubernetes.tar.gz
cd kubernetes/server
tar xf kubernetes-server-linux-amd64.tar.gz
cp -Rf kubernetes/ /usr/local/share
cp kubernetes/cluster/centos/node/scripts/remove-docker0.sh /usr/local/share/kubernetes/server/bin
cd /usr/local/bin
ln -s /usr/local/share/kubernetes/server/bin/hyperkube
ln -s /usr/local/share/kubernetes/server/bin/kube-apiserver
ln -s /usr/local/share/kubernetes/server/bin/kube-controller-manager
ln -s /usr/local/share/kubernetes/server/bin/kubectl
ln -s /usr/local/share/kubernetes/server/bin/kubelet
ln -s /usr/local/share/kubernetes/server/bin/kube-proxy
ln -s /usr/local/share/kubernetes/server/bin/kube-scheduler
ln -s /usr/local/share/kubernetes/server/bin/linkcheck
ln -s /usr/local/share/kubernetes/server/bin/remove-docker0.sh

主控服务器 A 除去前面提到的 ETCD 和 FlannelD 两个服务之外,需要三个服务

  • API Server

  • Controller Manager

  • Scheduler

前面下载的包解压之后,kubernetes/cluster/centos/master/scripts 中有以下脚本分别对应上面三个必要的服务:

  • apiserver.sh

  • controller-manager.sh

  • scheduler.sh

这几个脚本大概看了一下,是自动安装过程的一部分,这里拿来进行修改,以适应我们自己的环境,方便应用,也有利于学习,并最终生成一个符合自己洁癖的环境:D

apiserver.sh

  • MASTER_ADDRESS 取值为服务器 A 的地址

  • ETCD_SERVERS 取值为ETCD的完整网址

  • SERVICE_CLUSTER_IP_RANGE 中的内容,按照之前我们给 ETCD 初始化的 IP 范围来设置。

  • 修改过时用法:KUBE_API_ADDRESS="--insecure-bind-address=${MASTER_ADDRESS}"

  • 修改过时用法:KUBE_API_PORT="--insecure-port=8080"

  • cat <<EOF 所在行涉及的文件名,按照个人习惯更改

  • 用于服务定义的 service 文件,其中的 ExecStart 要注意修改为我们之前生成连接的位置。

最后把涉及证书的一块删掉,这部分内容比较繁杂,先砍掉为好

KUBE_APISERVER_OPTS="   \${KUBE_LOGTOSTDERR}         \\
                        \${KUBE_LOG_LEVEL}           \\
                        \${KUBE_ETCD_SERVERS}        \\
                        \${KUBE_API_ADDRESS}         \\
                        \${KUBE_API_PORT}            \\
                        \${MINION_PORT}              \\
                        \${KUBE_ALLOW_PRIV}          \\
                        \${KUBE_SERVICE_ADDRESSES}   \\"

编辑结束之后,运行该脚本,也就完成了 API SERVER 的配置。

语法错误等情况是在所难免的,可以使用 systemctl status -l [服务名称] 来检查出错信息,如果信息不够详尽,可以把所生成的环境文件中的 loglevel 设置为 0。

另外还可以直接把 ExecStart 中的最终内容直接在命令行执行进行除错。

controller-manager.sh 和 scheduler.sh

  • 修改 MASTER_ADDRESS

  • 修改文件位置

  • 执行

走到这里,就可以使用 kubectl get nodes 之类的命令来跟 Master 互动了,浏览器也可以在服务器的 8080 端口获得一点没用的基本信息了。

Docker

本不想在 Master 机安装 Docker,但是后面的 Kubernates UI,如果不涉及网络操作的话,似乎必须在 Master 上运行,所以只能如此处理了。

Docker 这里我们使用 Docker.io 提供的官方源进行安装:

# !bin/sh
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum update -y
yum install -y docker-engine
systemctl daemon-reload
systemctl enable docker

这个配置就不准备使用脚本生成了,会稍微麻烦一些,简单粗暴上代码:

  • 首先创建文件 /etc/systemd/system/docker.service.d/custom.conf 这个文件会覆盖 docker.service 中的部分内容
[Service]
Environment="HTTP_PROXY=10.211.55.2:8016" "NO_PROXY=localhost,center.docker.local,16.158.51.247"
EnvironmentFile=-/run/flannel/docker
EnvironmentFile=-/etc/sysconfig/kubernetes/docker
ExecStartPre=/usr/local/bin/remove-docker0.sh

上面文件中包含了代理的设置,用于在公司内网环境下,使用代理服务器获取外部仓库的内容。 两行EnvironmentFile,其中一个是我们自行编写的 Docker 环境文件,另一个则是 flannel 运行生成的配置文件,而 ExecStartPre 则是从 Kubernetes 压缩包中的 Docker 配置内容中抄来的,修改了文件位置而已。

上面看出,Docker 服务对 Flanneld 服务是有依赖的,经过对 systemctl status docker 的观察,可以看到这一服务在 /usr/lib/systemd/system/docker.service.d 生成了一份文件,用于声明这一依赖关系。

编辑这个文件:/etc/systemd/system/multi-user.target.wants/docker.service 如果位置不同,可以使用 find /etc -name 'docker.service',ExecStart 一行改为 ExecStart=/usr/bin/docker daemon $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPTS

systemctl daemon-reload
systemctl enable docker
systemctl start docker

Node

同样的,可以在 kubernetes/cluster/centos/node/scripts 找到两个 Node 服务的配置脚本,这里先后修改运行 kubelet.sh 以及 proxy.sh 即可。

Kubeletes UI

Kubeletes UI 的安装很简单:

kubectl create -f cluster/addons/kube-ui/kube-ui-rc.yaml --namespace=kube-system
kubectl create -f cluster/addons/kube-ui/kube-ui-svc.yaml --namespace=kube-system

运行之后,可以使用 kubectl get pods --all-namespace 查看进展状况,第一次创建,会到 Google 仓库下载基础镜像,前面介绍的代理使用技巧可能就派上用场了。等到状态从 Pending 变为 Running 之后,就可以用浏览器访问 http://master:8080/ui 来查看控制台了。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts