说明:kubernetes版本为1.13.1,所有节点操作系统均为centos 7。
参考:《kubernetes权威指南》
因为google的原因,kubeadm方式安装总是出现各种问题,故而决定采用二进制文件的方式自己动手安装。
<>1 安装docker
Master和Node上都需部署docker服务。
安装docker,部署私有image仓库,参考 docker私有化仓库部署及dockerfile示例
<https://blog.csdn.net/weixin_38380858/article/details/85255355>。
部署私有image仓库主要是考虑kubernetes用到的很多image在google
,如果不能直接下载可能需要到其它仓库下载,而且下载速度比较慢,不如直接下载到本地私有仓库。
<>2 部署Master
Master上需要部署etcd,kube-apiserver,kube-controller-manager,kube-scheduler。
<>下载
github上下载etcd二进制文件etcd-v3.3.10-linux-amd64.tar.gz:
https://github.com/etcd-io/etcd/releases
<https://github.com/etcd-io/etcd/releases>
github上下载kubernetes二进制文件kubernetes-server-linux-amd64.tar.gz:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md#server-binaries
<https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md#server-binaries>
<>准备证书
非本机访问kube-apiserver服务需要安全控制,这里选择CA证书方式。
生成CA证书:
cd /etc/kubernetes/ca openssl genrsa -out ca.key 2048 # 此处 ca.pem 文件名必须是这个,否则
kube-controller-manager 运行时会报错 openssl req -x509 -new -nodes -key ca.key -subj
"/CN=k8s-master" -days 5000 -out ca.pem
准备cnf文件,将openssl.cnf拷出来,在最后新增以下内容(此处照搬《Kubernetes权威指南》,含义不明,将IP.2替换为master节点ip
):
# 段落名称随意 [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 =
kubernetes.default.svc DNS.4= kubernetes.default.svc.cluster.local DNS.5 =
k8s-master IP.1= 169.169.0.1 IP.2 = 10.0.2.5
在req段中将req_extensions=v3_req的注释打开。
在v3_ca段中将subjectAltName引用上面新增的段落:
subjectAltName=@alt_names
生成kube-apiserver的server端证书:
openssl genrsa -out server.key 2048 # -config 指向上面修改后的 openssl.cnf 文件 openssl
req -new -key server.key -subj"/CN=k8s-master" -config
/etc/kubernetes/ca/openssl.cnf -out server.csr# -extfile 指向上面修改后的 openssl.cnf 文件
openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial
-days 5000 -extensions v3_req -extfile /etc/kubernetes/ca/openssl.cnf -out
server.crt
生成kube-controller-manager,kube-scheduler所需的client端证书:
openssl genrsa -out client.key 2048 openssl req -new -key client.key -subj
"/CN=k8s-master" -out client.csr openssl x509 -req -in client.csr -CA ca.pem
-CAkey ca.key -CAcreateserial -out client.crt -days 5000
<>部署etcd服务
解压下载好的etcd压缩包,将etcd和etcdctl文件复制到user/bin路径下,以便在各路径下都能使用这两个命令。
新建配置文件/etc/etcd/etcd.conf,实际上可以不用任何配置。
新建工作目录/var/lib/etcd。
新建systemd服务文件/usr/lib/systemd/system/etcd.service:
[Unit] Description=Etcd Server # 在 network 服务之后启动 After=network.target [Service
] Type=simple # 指向工作目录,必须存在,不会自动创建 WorkingDirectory=/var/lib/etcd/ # 指向配置文件
EnvironmentFile=/etc/etcd/etcd.conf # 指向 etcd 文件 ExecStart=/usr/bin/etcd [
Install] # 为了能开机自启,因为 multi-user.target 是开机自启的 WantedBy=multi-user.target
启动并打开开机自启,默认端口为2379。
# 刷新 systemd 服务文件 systemctl daemon-reload # .service 可省 systemctl enable etcd
systemctl start etcd# 查看健康状况 etcdctl cluster-health
<>部署kube-apiserver
步骤与etcd一样:
* 解压,将kube-apiserver复制到usr/bin/目录下;
* 新建配置文件
* 新建工作目录
* 新建systemd服务文件
配置文件/etc/kubernetes/apiserver.conf内容如下:
KUBE_API_ARGS="--storage-backend=etcd3 \ --etcd-servers=http://127.0.0.1:2379
\ # 本机ip --bind-address=10.0.2.5 \ # 集群虚拟ip范围
--service-cluster-ip-range=169.169.0.0/16 \ # 集群虚拟端口范围
--service-node-port-range=1-65535 \ # 准入控制插件
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota
\ --logtostderr=false \ # 日志路径 --log-dir=/var/log/kubernetes/apiserver \ # 日志等级
--v=2 \ # ca证书 --client-ca-file=/etc/kubernetes/ca/ca.pem \ # server端证书
--tls-private-key-file=/etc/kubernetes/ca/server.key \
--tls-cert-file=/etc/kubernetes/ca/server.crt"
systemd服务文件/usr/lib/systemd/system/kube-apiserver.service内容如下:
[Unit] Description=Kubernetes API Server Documentation=
https://github.com/GoogleCloudPlatform/kubernetes After=etcd.service Wants=
etcd.service[Service] Type=notify WorkingDirectory=
/var/lib/kubernetes/kube-apiserver/ EnvironmentFile=
/etc/kubernetes/apiserver.conf ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure LimitNOFIFE=65536 [Install] WantedBy=multi-user.target
<>准备kubeconfig文件
kube-controller-manager,kube-scheduler需要用到,共用一个即可,主要是指定CA证书和自己的证书:
apiVersion: v1 kind: Config users: - name: cm-sche user: client-certificate:
/etc/kubernetes/ca/client.crtclient-key: /etc/kubernetes/ca/client.key clusters:
- name: local cluster: certificate-authority: /etc/kubernetes/ca/ca.pem contexts
: - context: cluster: local user: cm-sche name: my-context current-context: my-
context
<>部署kube-controller-manager服务
配置:
KUBE_CONTROLLER_MANAGER_ARGS=" \ # 6443为默认安全端口 --master=https://10.0.2.5:6443
\ # 老版本可能是 service-account-key-file
--service-account-private-key-file=/etc/kubernetes/ca/server.key \
--root-ca-file=/etc/kubernetes/ca/ca.pem \ # 上面创建的 kubeconfig 文件
--kubeconfig=/etc/kubernetes/kubeconfig \ --logtostderr=false \
--log-dir=/var/log/kubernetes/controller-manager \ --v=2"
systemd服务文件:
[Unit] Description=Kubernetes Controller Manager Documentation=
https://github.com/GoogleCloudPlatform/kubernetes After=kube-apiserver.service
Requires=kube-apiserver.service [Service] WorkingDirectory=
/var/lib/kubernetes/kube-controller-manager/ EnvironmentFile=
/etc/kubernetes/controller-manager.conf ExecStart=
/usr/bin/kube-controller-manager$KUBE_CONTROLLER_MANAGER_ARGS Restart=
on-failure LimitNOFIFE=65536 [Install] WantedBy=multi-user.target
如果是从kube-apiserver复制过来的,注意一定要把Type=notify给去掉,它没有notify功能,systemd收不到notify
会认为启动失败以致于不断重启。
<>部署kube-scheduler服务
配置:
KUBE_SCHEDULER_ARGS="\ # 从安全端口访问 --master=https://10.0.2.5:6443 \ # 上面创建的
kubeconfig 文件 --kubeconfig=/etc/kubernetes/kubeconfig \ --logtostderr=false \
--log-dir=/var/log/kubernetes/scheduler \ --v=2"
systemd服务文件:
[Unit] Description=Kubernetes Scheduler Documentation=
https://github.com/GoogleCloudPlatform/kubernetes After=kube-apiserver.service
Wants=kube-apiserver.service [Service] WorkingDirectory=
/var/lib/kubernetes/kube-scheduler/ EnvironmentFile=
/etc/kubernetes/scheduler.conf ExecStart=/usr/bin/kube-scheduler
$KUBE_SCHEDULER_ARGS LimitNOFIFE=65536 Restart=on-failure [Install] WantedBy=
multi-user.target
以上全部启动,并打开开机自启,查看状态为running即可。
systemctl status xx.service
<>3 部署Node
Node上需要部署kubelet,kube-proxy服务。
<>准备证书,创建kubeconfig文件
如果与Master不在同一机器上,同样需要client端证书和kubeconfig文件。
生成kubelet,kube-proxy所需的client端证书,-subj参数/CN设为本机ip,ca.pem和ca.key文件从Master上拷过来:
openssl genrsa -out client.key 2048 openssl req -new -key client.key -subj
"/CN=10.0.2.6" -out client.csr openssl x509 -req -in client.csr -CA ca.pem
-CAkey ca.key -CAcreateserial -out client.crt -days 5000
kubeconfig文件内容如下:
apiVersion: v1 kind: Config users: # 名称不影响 - name: node-1 user:
client-certificate: /etc/kubernetes/ca/client.crt client-key:
/etc/kubernetes/ca/client.keyclusters: # 名称不影响 - name: test-lvjc cluster:
certificate-authority: /etc/kubernetes/ca/ca.crt # 相比Master上的,多一个 server 配置
server: https://10.0.2.5:6443 contexts: - context: cluster: test-lvjc user: node
-1 name: my-context current-context: my-context
<>部署kubelet
配置:
kube-apiserver的地址配置取消了,配置在kubeconfig
里面,如果参考老版本(比如我的《kubernetes权威指南》是1.6版本)的说明可能会有,此处去掉否则服务起不来。
KUBELET_ARGS=" \ # 本机ip --hostname-override=10.0.2.6 \ --logtostderr=false \
--log-dir=/var/log/kubernetes/kubelet \ --v=2 \
--kubeconfig=/etc/kubernetes/kubeconfig \ #
新版本默认值不是systemd了,使用默认值会导致与docker中的配置不一致,启动会报错 --cgroup-driver=systemd \ #
如果用的是私有库,这里指定pause镜像从私有库去拉
--pod-infra-container-image=10.0.2.5:443/k8s/pause-amd64:3.0"
systemd服务文件:
[Unit] Description=Kubelet Server Documentation=
https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=
docker.service[Service] WorkingDirectory=/var/lib/kubernetes/kubelet
EnvironmentFile=/etc/kubernetes/kubelet.conf ExecStart=/usr/bin/kubelet
$KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target
<>部署kube-proxy
配置
KUBE_PROXY_ARGS=" \ --logtostderr=false \
--log-dir=/var/log/kubernetes/kube-proxy \ --v=2 \
--kubeconfig=/etc/kubernetes/kubeconfig"
systemd服务文件:
[Unit] Description=Kube-Proxy Server Documentation=
https://github.com/GoogleCloudPlatform/kubernetes After=network.target Requires=
network.target[Service] WorkingDirectory=/var/lib/kubernetes/kube-proxy
EnvironmentFile=/etc/kubernetes/kube-proxy.conf ExecStart=/usr/bin/kube-proxy
$KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=
multi-user.target
以上两个服务全部启动,并打开开机自启,查看状态为running,再到Master上执行kubectl get nodes命令能看到Node状态为Ready
即可。
<>4 配置kubectl工具
Master和Node节点都配置kubectl,这样都可以操控集群。
下载的kubernetes包里有kubectl,复制到/usr/bin/目录下。
上面的kubeconfig文件复制一份到~/.kube/,且名称必须为config,这样可以在Node节点上访问kube-apiserver操控集群。
热门工具 换一换