本文讲解使用二进制文件方式安装k8s集群的方法。部署的是Kubernetes v1.8.8。
先从k8s官网找到对应的版本号,单击CHANGELOG,找到安装包的下载链接。或者直接点击下面的链接进去。
从页面表格中找到Server Binaries中的kubernetes-server-linux-amd64.tar.gz文件,下载到本地。
该压缩包中包括了k8s需要运行的全部服务程序文件,解压后如下所示:
-rwxr-xr-x. 1 root root 55191532 Feb 10 05:59 apiextensions-apiserver
-rwxr-xr-x. 1 root root 109306478 Feb 10 05:59 cloud-controller-manager
-rw-r--r--. 1 root root 7 Feb 10 05:59 cloud-controller-manager.docker_tag
-rw-r--r--. 1 root root 110683136 Feb 10 05:59 cloud-controller-manager.tar
-rwxr-xr-x. 1 root root 236888000 Feb 10 05:59 hyperkube
-rwxr-xr-x. 1 root root 136737665 Feb 10 05:59 kubeadm
-rwxr-xr-x. 1 root root 54030144 Feb 10 05:59 kube-aggregator
-rw-r--r--. 1 root root 7 Feb 10 05:59 kube-aggregator.docker_tag
-rw-r--r--. 1 root root 55406592 Feb 10 05:59 kube-aggregator.tar
-rwxr-xr-x. 1 root root 193579897 Feb 10 05:59 kube-apiserver
-rw-r--r--. 1 root root 7 Feb 10 05:59 kube-apiserver.docker_tag
-rw-r--r--. 1 root root 194956288 Feb 10 05:59 kube-apiserver.tar
-rwxr-xr-x. 1 root root 128451223 Feb 10 05:59 kube-controller-manager
-rw-r--r--. 1 root root 7 Feb 10 05:59 kube-controller-manager.docker_tag
-rw-r--r--. 1 root root 129827840 Feb 10 05:59 kube-controller-manager.tar
-rwxr-xr-x. 1 root root 52492214 Feb 10 06:00 kubectl
-rwxr-xr-x. 1 root root 56091648 Feb 10 06:00 kubefed
-rwxr-xr-x. 1 root root 138082408 Feb 10 05:59 kubelet
-rwxr-xr-x. 1 root root 48092971 Feb 10 05:59 kube-proxy
-rw-r--r--. 1 root root 7 Feb 10 05:59 kube-proxy.docker_tag
-rw-r--r--. 1 root root 95204864 Feb 10 05:59 kube-proxy.tar
-rwxr-xr-x. 1 root root 53985504 Feb 10 05:59 kube-scheduler
-rw-r--r--. 1 root root 7 Feb 10 05:59 kube-scheduler.docker_tag
-rw-r--r--. 1 root root 55362048 Feb 10 05:59 kube-scheduler.tar
从上图中一些文件的执行权限上可以看出,这些文件都是可执行的二进制文件。而k8s的服务都可以通过直接运行二进制文件加上启动参数的方式完成。
- 其中在Master节点上需要部署etcd、kube-apiserver、kube-controller-manager、kube-scheduler服务进程;
- 在工作节点上需要部署docker、kubelet和kube-proxy进程。
将正确的k8s服务二进制文件复制到/usr/bin目录下,就算是完成了软件的安装!接下来就是一些必要的参数配置了。
本次部署使用两个节点:
- Master节点,10.0.2.5
- Node节点,10.0.2.6
一、使用二进制方式部署k8s的Master节点
1、etcd服务
从
https://github.com/coreos/etcd/releases下载etcd二进制文件,将etcd和etcdctl文件复制到/usr/bin目录。
配置systemd服务文件:/usr/lib/systemd/system/etcd.service
[root@bogon system]# more etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/etcd/etcd.conf
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/bin/etcd
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动etcd服务:
[root@bogon system]# systemctl daemon-reload
[root@bogon system]# systemctl enable etcd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
[root@bogon system]# mkdir -p /var/lib/etcd/
[root@bogon system]# systemctl start etcd.service
[root@bogon system]# ss -an|grep 2379
tcp LISTEN 0 128 127.0.0.1:2379 *:*
tcp ESTAB 0 0 127.0.0.1:35242 127.0.0.1:2379
tcp ESTAB 0 0 127.0.0.1:2379 127.0.0.1:35242
检查etcd是否正确启动:
[root@bogon system]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from
http://localhost:2379
cluster is healthy
2、kube-apiserver服务
将解压后kube-apiserver、kube-controller-manager、kube-scheduler以及管理要使用的kubectl二进制命令文件放到/usr/bin目录,即完成这几个服务的安装。
接下来对api服务进行必要的配置。
配置systemd服务文件:/usr/lib/systemd/system/kube-apiserver.service
[root@bogon system]# more kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=
https://github.com/kubernetes/kubernetes
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
[Install]
WantedBy=multi-user.target
配置文件:
[root@bogon bin]# mkdir -p /etc/kubernetes
[root@bogon kubernetes]# more
/etc/kubernetes/
apiserver
KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=
http://127.0.0.1:2379
--insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=10.10.10.0/24 --servic
e-node-port-range=1-65535 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,DefaultStorageClass,ResourceQuota --logtostderr=true
--log-dir=/var/log/kubernetes --v=2"
3、kube-controller-manager服务
kube-controller-manager服务依赖于kube-apiserver服务:
配置systemd服务文件:/usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=
https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件:
[root@bogon kubernetes]# more controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--master=
http://10.0.2.5:8080
--logtostderr=true --log-dir=/var/log/kubernetes --v=2"
4、kube-scheduler服务
kube-scheduler服务也依赖于kube-apiserver服务。
配置systemd服务文件:/usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=
https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=-/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件:
[root@bogon
kubernetes]# cat /etc/
kubernetes/
scheduler
KUBE_SCHEDULER_ARGS=
"--master=
http://10.0.2.5:8080
--logtostderr=true
--log-dir=/var/log/kubernetes
--v=2"
5、完成以上配置后,按顺序启动这些服务
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
检查每个服务的健康状态:
systemctl status kube-apiserver.service
systemctl status kube-controller-manager.service
systemctl status kube-scheduler.service
如果有服务出现异常,可执行journalctl -xe -u kube-scheduler查看一个指定的服务的事件信息日志。
二、使用二进制方式部署k8s的Node节点
在Node节点上,以同样的方式把从压缩包中解压出的二进制文件kubelet kube-proxy放到/usr/bin目录中。
1、安装docker ce
先安装依赖工具包:
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker yum源:
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
安装docker引擎:
yum install
docker-ce-17.12.0.ce
systemctl start docker
执行docker info查看安装结果。
2、kubelet服务
配置systemd服务文件:/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
配置文件:
[root@bogon
kubernetes]# cat /etc/
kubernetes/
kubelet
KUBELET_ARGS="--address=10.0.2.6 --port=10250 --hostname-override=10.0.2.6 --allow-privileged=false --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --cluster-dns=10.10.10.2 --clust
er-domain=cluster.local --fail-swap-on=false --logtostderr=true --log-dir=/var/log/kubernetes --v=4"
用于kubelet连接Master Apiserver的配置文件
[root@worknode1 kubernetes]# more
/etc/
kubernetes/kubelet.kubeconfig
apiVersion: v1
kind: Config
clusters:
- cluster:
server:
http://10.0.2.5:8080
name: local
contexts:
- context:
cluster: local
name: local
current-context: loca
启动kubelet服务:
mkdir -p /var/lib/kubelet
mkdir -p /etc/kubernetes
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet
3、kube-proxy服务
kube-proxy服务依赖于network服务。
配置systemd服务文件:/usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-proxy Server
Documentation=
https://github.com/GoogleCloudPlatform/kubernetes
After=network.service
Requires=
network.service
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
KillMode=process
[Install]
WantedBy=multi-user.target
配置文件:
[root@bogon
kubernetes]# cat /etc/
kubernetes/proxy
KUBE_PROXY_ARGS
="
--master=http://10.0.2.5:8080
--hostname-override=10.0.2.6
--logtostderr=true --log-dir=/var/log/kubernetes --v=4"
启动kube-proxy服务:
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
systemctl status kube-proxy
4、手工在Node节点上下载和标记好一个Pod根容器会使用到的容器镜像文件
docker pull cloudnil/pause-amd64:3.0
docker tag cloudnil/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
注:如果你会科学上网,可以不做这一步。
三、对搭建完成的k8s集群进行一些验证测试
1、在Master上查看k8s各项服务状态
[root@bogon bin]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.0.2.6 Ready <none> 22m v1.8.8
[root@bogon bin]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.10.10.1 <none> 443/TCP 2h
[root@bogon bin]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
2、创建一个pod和service进行验证
(1)RC文件用于创建一个Pod:
[root@bogon ~]# more mysql-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
执行创建命令:
[root@bogon ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
查看结果:
[root@bogon ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 1h
[root@bogon ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-tjvjl 1/1 Running 0 8m
(2)Service定义文件:
[root@bogon ~]# more mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
执行创建service的命令:
[root@bogon ~]# kubectl create -f mysql-svc.yaml
service "mysql" created
查看结果:
[root@bogon ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.10.10.1 <none> 443/TCP 3h
mysql ClusterIP 10.10.10.200 <none> 3306/TCP 7s
(3)在Node节点上查看创建出来的容器
[root@worknode1 kubernetes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
663504b99210 mysql "docker-entrypoint.s…" 9 minutes ago Up 9 minutes k8s_mysql_mysql-tjvjl_default_bfdab18b-199f-11e8-bd9c-080027cf1a4c_0
32a736ec4fed gcr.io/google_containers/pause-amd64:3.0 "/pause" 10 minutes ago Up 10 minutes k8s_POD_mysql-tjvjl_default_bfdab18b-199f-11e8-bd9c-080027cf1a4c_0
参考1:《Kubernetes权威指南——从Docker到Kubernetes实践全接触》第2章。