Ⅰ.搭建前须知
- 建议首先要搭建yum源用来安装docker,以及后续的各种安装包。
- K8s集群需要加密访问,需要建个.kube目录保存授权信息。
- K8s集群只有在部署网络插件后Node才能变为Ready。
- kube-system是K8s项目预留的系统Pod的工作空间。
- usr/lib/systemd/system/ 一般是系统的工作目录,所以我们要把各种二进制文件复制到这里来,然后就可以enable服务了
- /var/lib/etcd 是工作目录(保存数据的地方),二进制文件在这里运行。工作目录也有 /var/lib/kube-proxy之类的
- /etc/kubernetes 是各个二进制文件运行所依赖的配置文件的存放处 其中各个二进制文件配置都有需要注意的地方
- ~/.kube/config 是使用kubectl命令行工具必须的配置文件,
- echo "export PATH=/test/kubernetes-bins:$PATH" >> /etc/profile 可以用这行命令设置环境变量
组件 | 链接 |
---|---|
docker | https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ |
k8s组件 | https://github.com/kubernetes/kubernetes/releases |
etcd | https://github.com/etcd-io/etcd/releases?after=v3.2.17 |
bridge-util软件 | http://www.rpmfind.net/linux/rpm2html/search.php?query=bridge-utils(x86-64) |
cfssl | https://github.com/cloudflare/cfssl 、https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 |
calico插件 | https://github.com/projectcalico/calico/releases/ |
calico容器镜像 | http://quay.io/calico/kube-controllers:v3.1.3 |
dockers-compose组件 | https://github.com/docker/compose/releases |
harbor组件 | https://github.com/goharbor/harbor/releases |
1.搭建本地yum源安装docker
1.使用yum安装httpd 、 createrepo
yum -y install httpd* httpd-devel createrepo
2.安装完成测试
service httpd restart ##启动httpd
测试 netstat -tlun 查看端口80是否存在,可以修改httpd.conf文件修改服务端口。
3.新建目录,并把需要的rpm包在网页上发布的目录放在/var/www/html/下面
然后进入这个/var/www/html/datat/这个目录下面 然后输入命令createrepo ./生成一个repodata的目录。(这一步是创建索引存储库)
如果以后这个/var/www/html/data/的目录下添加rpm包用命令createrepo --update ./(这里必须在/var/www/html/data/执行 因为是./代表当前目录)更新就可以了
4.本地新建repo文件,yum指定安装源进行安装。当然可以只把以上网址当做下载地址,下载下来本地安装。
yum -y install docker-ce --enablerepo=http
2.安装Docker
1.下载相关rpm,由于17.03.2-ce 默认前置selinux-17.03.2.ce,去相关网站(docker本源站、阿里镜像站)下载这两个包docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm、docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm。
2.把文件上传到要安装的服务器,在上传的目录下执行yum localinstall命令安装
yum localinstall docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
yum localinstall docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
3.开启docker服务
service docker start
4.查看docker信息,验证版本号为17.03.2-ce
docker info
3.下载K8s 1.10.11二进制组件
1.从K8s github上找到相关版本,进入下载相关二进制组件
2.进入 CHANGELOG-1.10.md 选择选择Service Binaries中的kubernetes-server-linux-amd64.tar.gz 该文件已经包含了 K8S所需要的全部组件,无需单独下载Client等组件。
但这里还是没有etcd的组件,需要在相关连接下载,这里使用的是etcd v3.2.16.当然事实上这些二进制组件都可以使用rpm文件进行安装。而kubeadm则更进一步,把这些二进制组件全部打包成镜像,到时候直接下载镜像并运行,来提供服务。
3.规划不同节点需要安装的文件
节点IP地址 | 角色 | 安装组件名称 |
---|---|---|
47.111.145.31 | Master(管理节点) | docker、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubectl |
47.110.11.33 | Node1(计算节点) | docker 、kubelet、kube-proxy 、kubectl |
114.55.175.117 | Node2(计算节点) | docker 、kubelet、kube-proxy 、kubectl |
PS:以上是K8s集群的必要组件,或者说是最小化组件,必须有这些才能完成K8s集群的基本工作。后面还会在各个节点上装calico(提供网络功能,网络插件用yaml文件起一个pod即可)、装kube-dns(为集群提供dns功能)、以及最关键的kubernetes-with-ca组件(使用cfssl改造以上所有组件)
4.接下来思路是
1)把每个组件依次复制到/usr/bin目录文件下(当然也可在任意路径设置绝对路径,这里没有使用这种方法)。
2)创建systemd服务文件即.service。
3)创建service 中对应的配置参数文件。(以上两步共会创建近10个文件,可以提前写好直接上传到对应路径.当然你也可以不写参数文件,在service中把全部参数写好)
4)设置开机自启。
5)最后启动该组件。(执行相关命令即可)
6)授权改造。
组件名 | 二进制文件位置 | service位置 | conf位置 |
---|---|---|---|
pem | /usr/bin | ||
etcd | /usr/bin | /etc/systemd/system/etcd.service | /etc/etcd/etcd.conf |
kube-apiserver | /usr/bin | /usr/lib/systemd/system/kube-apiserver.service | /etc/kubernetes/apiserver |
kube-controller-manager | /usr/bin | /usr/lib/systemd/system/kube-controller-manager.service | /etc/kubernetes/controller-manager |
kube-sheduler | /usr/bin | /usr/lib/systemd/system/kube-scheduler.service | /etc/kubernetes/scheduler |
kubectl | /usr/bin | /usr/lib/systemd/system/kubelet.service | /etc/kubernetes/kubelet、/var/lib/kubelet/kubeconfig |
kube-proxy | /usr/bin | usr/lib/systemd/system/kube-proxy.service | /etc/kubernetes/proxy |
4.节点设置
1.关闭、禁用防火墙(让所有机器之间都可以通过任意端口建立连接)
$ systemctl stop firewalld
$ systemctl disable firewalld
2.禁用SELINUX
$ setenforce 0
$ cat /etc/selinux/config
SELINUX=disabled
安装bridge-util软件,加载bridge模块,加载br_netfilter模块
yum localinstall -y bridge-utils-1.5-9.el7.x86_64.rpm
modprobe bridge
modprobe br_netfilter
3.设置系统参数 - 允许路由转发,不对bridge的数据进行处理
#写入配置文件
$ cat <
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#生效配置文件
$ sysctl --system
4.关闭交换
$swapoff -a
5.配置host文件
查看各个主机hostname
设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
#配置host,使每个Node都可以通过名字解析到ip地址
$ vi /etc/hosts
#加入如下片段(ip地址和servername替换成自己的)
47.111.145.31 master
47.110.11.33 node1
114.55.175.117 node2
5.认证授权机制基础
其实没有认证授权机制,K8s集群也能跑,也能运行。但是正是为了防止有人入侵你的集群,root一台机器黑了整个集群,需要引入了业界成熟的认证授权方案。
kubernetes提供了多种认证方式,比如客户端证书、静态token、静态密码文件、ServiceAccountTokens等等。如果同时使用一种或多种认证方式。只要通过任何一个都被认作是认证通过。常见的认证方式有:客户端证书认证、引导Token、Service Account Tokens 认证。而自K8s 1.6引入了角色访问控制机制(RBAC),我们也使用这种方法。
cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件
组件 | 要安装的证书 |
---|---|
etcd | ca.pem 、server.pem 、server-key.pem |
kube-apiserver | ca.pem 、server.pem 、server-key.pem |
kubelet | ca.pem 、ca-key.pem |
kube-proxy | ca.pem 、kube-proxy.pem 、kube-proxy-key.pem |
kubectl | ca.pem 、admin.pem 、admin-key.pem |
设置好json文件,为所有节点创建公钥私钥,最后只需要pem文件,pem文件拷到三台机子上即可。
下载证书,上传到usr/local/bin 文件夹 执行chmod +x *
只要pem文件生成的是对的,最后只要在各个service里更新--cacert、--cert、--key即可。
Ⅱ.Master节点部署
启动etcd、kube-apiserver、kube-controller-manger、kube-scheduler、kubectl
上传kubernetes-server-linux-amd64.tar.gz,进行解压。
tar -zxvf kubernetes-server-linux-amd64.tar.gz
对不同的进行打包复制、复制到相应位置。
cp /kubernetes-server-linux-amd64.tar.gz /k8s
chmod +x 修改可执行权限 至关重要!!
1.装etcd
(1) ectd数据库安装 下载解压后将etcd、etcdctl二进制文件复制到/usr/bin目录
cp /k8s/etcd-v3.2.16-linux-amd64/etcd* /usr/bin
cp /k8s/etcd-v3.2.16-linux-amd64/etcd /usr/bin
cp /k8s/etcd-v3.2.16-linux-amd64/etcdctl /usr/bin
(2)设置 etcd.service服务文件 在/etc/systemd/system/目录里创建etcd.service,其内容如下
$ cat /etc/systemd/system/etcd.service
[Unit]
Description=etcd.service
[Service]
Type=notify
TimeoutStartSec=0
Restart=always
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
[Install]
WantedBy=multi-user.target
EOF
其中WorkingDirectory为etcd数据库目录,需要在etcd安装前创建
(3)创建配置/etc/etcd/etcd.conf文件
$ cat /etc/etcd/etcd.conf
ETCD_NAME=ETCD Server
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://masterIP地址:2379"
EOF
(4)配置开机启动
$systemctl daemon-reload
$systemctl enable etcd.service
$systemctl start etcd.service
(5)检验etcd是否安装成功
$ etcdctl cluster-health
2.装kube-apiserver服务
(1)复制二进制文件到/usr/bin目录 将kube-apiserver、kube-controller-manager、kube-scheduler 三个可执行文件复制到/usr/bin目录
cp /k8s/kubernetes/server/bin/kube* /usr/bin
cp /k8s/kubernetes/server/bin/kube-apiserver /usr/bin
cp /k8s/kubernetes/server/bin/kube-controller-manager /usr/bin
cp /k8s/kubernetes/server/bin/kube-scheduler /usr/bin
(2)新建并编辑/kube-apiserver.service 文件
$cat /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver \
$KUBE_ETCD_SERVERS \
$KUBE_API_ADDRESS \
$KUBE_API_PORT \
$KUBE_SERVICE_ADDRESSES \
$KUBE_ADMISSION_CONTROL \
$KUBE_API_LOG \
$KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
(3)新建参数配置文件/etc/kubernetes/apiserver
$cat /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://masterIP地址:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=169.169.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_LOG="--logtostderr=false --log-dir=/home/k8s-t/log/kubernets --v=2"
KUBE_API_ARGS=" "
3.kube-controller-manger部署
(1)配置kube-controller-manager systemd 文件服务 命令内容如下:
$cat /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/bin/kube-controller-manager \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--allocate-node-cidrs=true \
--service-cluster-ip-range=169.169.0.0/16 \
--cluster-cidr=172.20.0.0/16 \
--cluster-name=kubernetes \
--leader-elect=true \
--cluster-signing-cert-file= \
--cluster-signing-key-file= \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
4.kube-scheduler组件部署
(1)配置kube-scheduler systemd服务文件
$cat /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/bin/kube-scheduler \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--leader-elect=true \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
5.将各组件加入开机自启
(1)命令如下:
systemctl daemon-reload
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
(2)Master一键重启服务:
for i in etcd kube-apiserver kube-controller-manager kube-scheduler docker;do systemctl restart $i;done
(3)验证服务
journalctl -f -u kube-scheduler
systemctl status kube-controller-manager该命令可查看各个组件是否正常运行
systemctl daemon-reload && systemctl restart kubelet 可以在运行失败后修改文件重新启动
netstat -tunlp 查看端口号
可以看到etcd、kube-apiservice、kube-controll、kube-schedule已经启动并提供服务。
6.Calico部署
(1)解压压缩包复制calico、calicoctl、calico-ipam到usr/bin:
(1)配置kube-calico.service文件服务 命令内容如下:(注意提前下载并在本地load好calico的镜像docker load -i calico.tar,并创建相关目录)
注意如果etcd没使用加密的情况下etcd的地址要使用http。否则会报错,因为默认是https。
[Unit]
Description=calico node
After=docker.service
Requires=docker.service
[Service]
User=root
PermissionsStartOnly=true
ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \
-e ETCD_ENDPOINTS=http://47.111.145.31:2379 \
-e CALICO_LIBNETWORK_ENABLED=true \
-e CALICO_NETWORKING_BACKEND=bird \
-e CALICO_DISABLE_FILE_LOGGING=true \
-e CALICO_IPV4POOL_CIDR=172.20.0.0/16 \
-e CALICO_IPV4POOL_IPIP=off \
-e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT \
-e FELIX_IPV6SUPPORT=false \
-e FELIX_LOGSEVERITYSCREEN=info \
-e FELIX_IPINIPMTU=1440 \
-e FELIX_HEALTHENABLED=true \
-e IP=47.111.145.31 \
-v /var/run/calico:/var/run/calico \
-v /lib/modules:/lib/modules \
-v /run/docker/plugins:/run/docker/plugins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/log/calico:/var/log/calico \
calico-node:v2.6.2
ExecStop=/usr/bin/docker rm -f calico-node
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
(3)启动相关服务,命令内容如下:
systemctl daemon-reload
systemctl enable kube-calico.service
systemctl start kube-calico.service
systemctl status kube-calico.service
journalctl -f -u kube-calico
calicoctl node status
Ⅲ.Node节点部署
1.安装kube-proxy服务
(1)添加/usr/lib/systemd/system/kube-proxy.service文件,内容如下:
[Unit]
Description=Kubernetes Kube-Proxy Server
After=network.target
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
(2)创建/etc/kubernetes目录
$mkdir -p /etc/kubernetes
(3)添加/etc/kubernetes/proxy配置文件 vim /etc/kubernetes/proxy,内容如下:
KUBE_PROXY_ARGS=""
(4)添加/etc/kubernetes/config文件 192.168.1.10是本地局域网
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
KUBE_MASTER="--master=http://192.168.1.10:8080"
(5)启动kube-proxy服务
$systemctl daemon-reload
$systemctl enable kube-proxy.service
$systemctl start kube-proxy.service
$journalctl -f -u kube-proxy
$systemctl status kube-proxy
(6)查看kube-proxy启动状态
$netstat -lntp | grep kube-proxy
2. 安装kubelet服务
(1) 创建/usr/lib/systemd/system/kubelet.service文件
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
(2) 创建kubelet所需文件路径
mkdir -p /var/lib/kubelet
(3) 创建kubelet配置文件
vim /etc/kubernetes/kubelet,内容如下:
KUBELET_HOSTNAME="--hostname-override=47.111.145.31"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=ist0ne/pause-amd64:latest"
KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-swap-on=false --kubeconfig=/var/lib/kubelet/kubeconfig"
(4) 添加/var/lib/kubelet/kubeconfig文件
然后还要添加一个配置文件,因为从1.9.0开始在kubelet里不再使用KUBELET_API_SERVER来跟API通信,而是通过别一个yaml的配置来实现。
vim /var/lib/kubelet/kubeconfig ,内容如下:
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: http://47.111.145.31:8080
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: ""
name: system:node:kube-master
current-context: system:node:kube-master
kind: Config
preferences: {}
users: []
5)启动kubelet
关闭swap分区:swapoff -a (不然kubelet启动报错)
systemctl daemon-reload
systemctl enable kubelet.service
systemctl start kubelet.service
systemctl status kubelet
(6)查看kubelet文件状态
$ netstat -lntp | grep kubelet
(7)获取节点:
Ⅳ.网络插件、安全插件的安装
1.Harbor
下载docker-compose,下载Harbor对应版本,使用解压出的.sh脚本进行安装。
2.Dashboard
与网络插件同理,下载yaml文件,kubectl apply启动,可能需要提前下载相关镜像。
Ⅴ.FAQ
如果你在搭建中遇到了一些错误,可以来这里看看有没有解答.
1.为什么我服务(.service文件)启动失败了?
如图:
关于服务启动失败有很多不同的原因,下面列出几个遇到过的:
code=exited,status=1/failure
这个问题是整个服务就没有起来
~原因一:配置文件格式错误,比如.service中文件格式出错
~原因二:.service文件没有可执行权限,ls -l查看权限,没有执行权限则chmod +x即可。
Comments | NOTHING