Kubernetes1.8.3 集群环境搭建(CentOS)
来源:互联网 发布:淘宝彩票在哪里 编辑:程序博客网 时间:2024/05/29 17:18
部署环境
此次部署kubernetes1.8.3
版本使用两台机器进行操作,一台做为Master
节点,一台作为Node
节点。部署流程及配置与正式环境下是一致的。
Kubernetes Master节点:10.0.11.222
Kubernetes Node节点:10.0.11.221
部署软件
CentOS:CentOS 7.3
Docker:17.03.2-ce
Kubernetes:1.8.3
etcd:3.2.7
flannel:v0.7.1
准备工作
master
节点、node
节点都要做这些准备工作。
关闭防火墙
# 关闭防火墙[root@mimo222 ~]# systemctl stop firewalld# 禁用防火墙[root@mimo222 ~]# systemctl disable firewalld
禁用selinux
# 设置selinux为关闭[root@mimo222 ~]# setenforce 0# 打开selinux配置文件[root@mimo222 ~]# vim /etc/selinux/config# SELINUX配置项修改为disabledSELINUX=disabled
创建验证
此次安装kubernetes1.8.3
,我们使用基于CA签名
的数字证书认证方式,通过cfssl
进行证书生成。此次安装是单Master节点
,因此证书的生成都在Master
节点完成。如果你安装的是多Master节点
,那么可在其中一个Master
节点生成证书,然后同步将证书拷贝到其他的Master
(注意:多个Master
节点的证书目录一定要一致,以避免不必要的问题出现)。最后,在配置Node
节点时,我们可以从Master
节点拷贝Node
节点需要的证书。
安装 cfssl
[root@mimo222 ~]# mkdir -p /opt/local/cfssl[root@mimo222 ~]# cd /opt/local/cfssl[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64[root@mimo222 ~]# mv cfssl_linux-amd64 cfssl[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64[root@mimo222 ~]# mv cfssljson_linux-amd64 cfssljson[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64[root@mimo222 ~]# mv cfssl-certinfo_linux-amd64 cfssl-certinfo[root@mimo222 ~]# chmod +x *
安装cfssl
需要下载上面命令中的三个文件,如果通过wget
无法下载,可通过直接在网页上访问该链接下载,然后拷贝到/opt/local/cfssl
目录。注意修改文件权限。
创建 CA 证书配置
创建ssl
目录:
[root@mimo222 ~]# mkdir /opt/ssl[root@mimo222 ~]# cd /opt/ssl
在/opt/ssl
目录下创建config.json
文件:
vi config.json{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } }}
在/opt/ssl
目录下创建csr.json
文件:
vi csr.json{ "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "k8s", "OU": "System" } ]}
生成 CA 证书和私钥
[root@mimo222 ~]# cd /opt/ssl/# 生成CA证书和私钥[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -initca csr.json | /opt/local/cfssl/cfssljson -bare ca[root@mimo222 ~]# ls -lttotal 5-rw-r--r-- 1 root root 1005 Dec 14 17:48 ca.csr-rw------- 1 root root 1679 Dec 14 17:48 ca-key.pem-rw-r--r-- 1 root root 1363 Dec 14 17:48 ca.pem-rw-r--r--. 1 root root 292 Dec 14 17:45 config.json-rw-r--r-- 1 root root 210 Dec 14 17:48 csr.json
分发证书
我们将所有kubernetes
相关的证书都保存到/etc/kubernetes/ssl
目录,方便管理。
# 创建证书目录[root@mimo222 ~]# mkdir -p /etc/kubernetes/ssl# 拷贝所有文件到目录下[root@mimo222 ~]# cp *.pem /etc/kubernetes/ssl[root@mimo222 ~]# cp ca.csr /etc/kubernetes/ssl# 这里要将文件拷贝到所有的k8s Master机器上# 这里演示一下多Master节点时证书的保存方式,在每次生成证书之后,都可以通过下面的方式将证书拷贝# 到远程Master节点,保证数据的同步。下面其他证书方式一样,就不再写了。[root@mimo222 ~]# scp *.pem xx.xx.xx.xx:/etc/kubernetes/ssl/[root@mimo222 ~]# scp *.csr xx.xx.xx.xx:/etc/kubernetes/ssl/
安装Docker
所有kubernetes
节点都需要安装docker
,并且版本最好一致。
开始安装
# 删除老版本Docker及依赖,如果机器上装过其他版本的docker,可通过该命令进行老版本docker清理[root@mimo222 ~]# yum remove docker docker-common container-selinux docker-selinux docker-engine# 安装 yum-config-manager[root@mimo222 ~]# yum -y install yum-utils# 导入yum源[root@mimo222 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 更新repo[root@mimo222 ~]# yum makecache# 查看yum版本[root@mimo222 ~]# yum list docker-ce.x86_64 --showduplicates |sort -r# 安装指定版本docker-ce 17.03被docker-ce-selinux依赖,不能直接yum安装docker-ce-selinux# 如果此处通过wget无法下载,可到网上查一下这个rpm包,下载下来然后拷贝到服务器上。[root@mimo222 ~]# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm[root@mimo222 ~]# rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm# 安装docker[root@mimo222 ~]# yum -y install docker-ce-17.03.2.ce
查看docker版本
[root@mimo222 ~]# docker versionClient: Version: 17.03.2-ce API version: 1.27 Go version: go1.7.5 Git commit: f5ec1e2 Built: Tue Jun 27 02:21:36 2017 OS/Arch: linux/amd64Server: Version: 17.03.2-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: f5ec1e2 Built: Tue Jun 27 02:21:36 2017 OS/Arch: linux/amd64 Experimental: false
更改docker配置
更改/usr/lib/systemd/system/docker.service
启动文件
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS $DOCKER_DNS_OPTIONS# 添加这行操作,在每次重启docker之前都会设置iptables策略为ACCEPTExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPTExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s[Install]WantedBy=multi-user.target
对比初始安装docker
后的docker.service
文件内容,修改docker.service
文件。
Docker
从1.13
版本开始,可能将iptables FORWARD chain
的默认策略设置为DROP
,从而导致ping
其他Node
上的Pod IP
失败。因此,需要在docker.service文件中添加ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
。
修改其他配置(Docker启动参数配置)
[root@mimo222 ~]# mkdir -p /usr/lib/systemd/system/docker.service.d/
docker-options.conf
该文件中保存docker
启动的一些参数
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-options.conf# 文件中添加信息如下:(注意 Environment配置信息必须在同一行,如果出现换行会无法加载)[Service]Environment="DOCKER_OPTS=--insecure-registry=10.254.0.0/16 --graph=/opt/docker --disable-legacy-registry --insecure-registry 10.0.11.222:5000 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
--insecure-registry 10.0.11.222:5000
:这个是我本地私有镜像库地址,大家根据自己需要修改。
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
:Swarm
集群需要的agent配置。
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-dns.conf# 添加如下 : [Service]Environment="DOCKER_DNS_OPTIONS=\ --dns 10.254.0.2 --dns 114.114.114.114 \ --dns-search default.svc.cluster.local --dns-search svc.cluster.local \ --dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2"
flannel.conf
:该文件保存了读取flannel
网络分段信息
# 1. 该配置文件用于和flannel网络交互,若使用的网络配置不是flannel,则无需该配置文件# 2. 该配置文件需在flannel安装配置之后才能生效vi /usr/lib/systemd/system/docker.service.d/flannel.conf添加如下信息:[Service]EnvironmentFile=-/run/flannel/docker
启动、重启、查看docker
# 重新读取配置[root@mimo222 ~]# systemctl daemon-reload# 启动docker[root@mimo222 ~]# systemctl start docker# 设置为开机启动[root@mimo222 ~]# systemctl enable docker# 查看docker运行状态[root@mimo222 ~]# systemctl status docker# 重启docker[root@mimo222 ~]# systemctl restart docker# 停止运行docker[root@mimo222 ~]# systemctl stop docker
etcd安装配置
etcd
是kubernetes
集群最重要的组件, etcd
挂了,集群就挂了。
安装etcd
这里我是在别的地方下载了etcd-3.2.9-3.el7.x86_64.rpm
,然后拷贝到服务器上进行安装。
rpm -ivh etcd-3.2.9-3.el7.x86_64.rpm
创建etcd证书
[root@mimo222 ~]# cd /opt/ssl/[root@mimo222 ~]# vi etcd-csr.json# 添加如下内容:{ "CN": "etcd", "hosts": [ "127.0.0.1", "10.0.11.222" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "k8s", "OU": "System" } ]}
其中,hosts
中填写的是etcd节点的地址,这里只安装了单节点etcd
,因此只填写了etcd
本地地址127.0.0.1
以及10.0.11.222
。如果安装的是etcd
集群,则需要在hosts
中添加别的etcd
节点的ip
地址。
# 生成 etcd 密钥/opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \ -ca-key=/opt/ssl/ca-key.pem \ -config=/opt/ssl/config.json \ -profile=kubernetes etcd-csr.json | /opt/local/cfssl/cfssljson -bare etcd
/opt/local/cfssl/cfssl
:使用cfssl进行证书生成
# 查看生成信息[root@mimo222 ~]# ll etcd*-rw-r--r-- 1 root root 1050 Dec 14 18:31 etcd.csr-rw-r--r-- 1 root root 257 Dec 14 18:31 etcd-csr.json-rw------- 1 root root 1679 Dec 14 18:31 etcd-key.pem-rw-r--r-- 1 root root 1424 Dec 14 18:31 etcd.pem# 拷贝[root@mimo222 ~]# cp etcd*.pem /etc/kubernetes/ssl/# 如果 etcd 非 root 用户,读取证书会提示没权限[root@mimo222 ~]# chmod 644 /etc/kubernetes/ssl/etcd-key.pem
修改etcd配置
修改 etcd
配置文件/etc/etcd/etcd.conf
# 备份原来的etcd.conf配置文件mv /etc/etcd/etcd.conf /etc/etcd/etcd.conf-bak# 重新写一份配置文件vi /etc/etcd/etcd.conf# [member]ETCD_NAME=etcd1 # etcd节点名称ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"ETCD_WAL_DIR="/var/lib/etcd/wal"ETCD_SNAPSHOT_COUNT="100"ETCD_HEARTBEAT_INTERVAL="100"ETCD_ELECTION_TIMEOUT="1000"ETCD_LISTEN_PEER_URLS="https://[Node IP]:2380" ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"ETCD_MAX_SNAPSHOTS="5"ETCD_MAX_WALS="5"#ETCD_CORS=""# [cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS="https://[Node IP]:2380"# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."ETCD_INITIAL_CLUSTER="etcd1=https://[Node IP]:2380"ETCD_INITIAL_CLUSTER_STATE="new"ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"ETCD_ADVERTISE_CLIENT_URLS="https://[Node IP]:2379"#ETCD_DISCOVERY=""#ETCD_DISCOVERY_SRV=""#ETCD_DISCOVERY_FALLBACK="proxy"#ETCD_DISCOVERY_PROXY=""#ETCD_STRICT_RECONFIG_CHECK="false"#ETCD_AUTO_COMPACTION_RETENTION="0"# [proxy]#ETCD_PROXY="off"#ETCD_PROXY_FAILURE_WAIT="5000"#ETCD_PROXY_REFRESH_INTERVAL="30000"#ETCD_PROXY_DIAL_TIMEOUT="1000"#ETCD_PROXY_WRITE_TIMEOUT="5000"#ETCD_PROXY_READ_TIMEOUT="0"# [security]ETCD_CERT_FILE="/etc/kubernetes/ssl/etcd.pem"ETCD_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem"ETCD_CLIENT_CERT_AUTH="true"ETCD_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"ETCD_AUTO_TLS="true"ETCD_PEER_CERT_FILE="/etc/kubernetes/ssl/etcd.pem"ETCD_PEER_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem"ETCD_PEER_CLIENT_CERT_AUTH="true"ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"ETCD_PEER_AUTO_TLS="true"# [logging]#ETCD_DEBUG="false"# examples for -log-package-levels etcdserver=WARNING,security=DEBUG#ETCD_LOG_PACKAGE_LEVELS=""
注意:
1、将上面的配置文件中的[Node IP]
都修改为本机IP,这里我安装在10.0.11.222,因此都修改成了10.0.11.222。
2、[security]
下的配置项指定了证书的位置,因此要注意证书的位置是否正确。
3、如果安装的是etcd集群,配置文件信息基本一致,只要修改[Node IP]
为etcd节点的主机IP即可,同时修改ETCD_INITIAL_CLUSTER
项,该项需要添加所有etcd节点,例如: ETCD_INITIAL_CLUSTER="etcd1=https://172.16.1.64:2380,etcd2=https://172.16.1.65:2380,etcd3=https://172.16.1.66:2380"
。
启动 etcd
[root@mimo222 ~]# systemctl enable etcd[root@mimo222 ~]# systemctl start etcd[root@mimo222 ~]# systemctl status etcd# 如果报错 请使用journalctl -f -t etcd 和 journalctl -u etcd 来定位问题[root@mimo222 ~]# journalctl -f -t etcd
验证 etcd 状态
查看 etcd 状态
若为etcd
集群,则--endpoints
需要填写所有etcd
节点IP:PORT
etcdctl --endpoints=https://10.0.11.222:2379\ --cert-file=/etc/kubernetes/ssl/etcd.pem \ --ca-file=/etc/kubernetes/ssl/ca.pem \ --key-file=/etc/kubernetes/ssl/etcd-key.pem \ cluster-healthmember 2012db49e3efb509 is healthy: got healthy result from https://10.0.11.222:2379cluster is healthy
查看 etcd 集群成员
etcdctl --endpoints=https://10.0.11.222:2379\ --cert-file=/etc/kubernetes/ssl/etcd.pem \ --ca-file=/etc/kubernetes/ssl/ca.pem \ --key-file=/etc/kubernetes/ssl/etcd-key.pem \ member list2012db49e3efb509: name=etcd1 peerURLs=http://10.0.11.222:2380 clientURLs=https://10.0.11.222:2379 isLeader=true
Kubernetes Master节点安装配置
Master
需要部署 kube-apiserver
, kube-scheduler
, kube-controller-manager
这三个组件。 kube-scheduler
作用是调度pods
分配到那个node
里,简单来说就是资源调度。 kube-controller-manager
作用是 对 deployment controller
, replication controller
, endpoints controller
, namespace controller
and serviceaccounts controller
等等的循环控制,与kube-apiserver
交互。
安装组件
[root@mimo222 ~]# mkdir /tmp/kubernetes[root@mimo222 ~]# cd /tmp/kubernetes# 这个包比较大,几百兆,我通过wget没有下下来... 直接在网页上输入这个网址,然后一点一点下载下来了..# 大家可以用别的方法下载,然后拷贝到服务器上即可。[root@mimo222 ~]# wget https://dl.k8s.io/v1.8.3/kubernetes-server-linux-amd64.tar.gz[root@mimo222 ~]# tar -xzvf kubernetes-server-linux-amd64.tar.gz[root@mimo222 ~]# cd kubernetes# Master节点不需要kubelet、kube-proxy,因此这里没有拷贝这俩,如果要将master节点也装成node节点,# 则kubelet、kube-proxy这俩就需要拷贝出来了。[root@mimo222 ~]# cp -r server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl} /usr/local/bin/
创建admin证书
kubectl
与 kube-apiserver
的安全端口通信,需要为安全通信提供 TLS
证书和秘钥。
[root@mimo222 ~]# cd /opt/ssl/[root@mimo222 ~]# vi admin-csr.json# 添加以下信息:{ "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "system:masters", "OU": "System" } ]}
生成admin
证书和私钥
[root@mimo222 ~]# cd /opt/ssl//opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/opt/ssl/config.json \ -profile=kubernetes admin-csr.json | /opt/local/cfssl/cfssljson -bare admin
查看生成
[root@mimo222 ssl]# ll admin*-rw-r--r-- 1 root root 1013 Dec 14 19:22 admin.csr-rw-r--r-- 1 root root 231 Dec 14 19:22 admin-csr.json-rw------- 1 root root 1679 Dec 14 19:22 admin-key.pem-rw-r--r-- 1 root root 1407 Dec 14 19:22 admin.pem
拷贝到指定目录
cp admin*.pem /etc/kubernetes/ssl/
配置 kubectl kubeconfig 文件
生成证书相关的配置文件存储与 /root/.kube
目录中
# 配置 kubernetes 集群kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://10.0.11.222:6443# 配置 客户端认证kubectl config set-credentials admin \ --client-certificate=/etc/kubernetes/ssl/admin.pem \ --embed-certs=true \ --client-key=/etc/kubernetes/ssl/admin-key.pemkubectl config set-context kubernetes \ --cluster=kubernetes \ --user=adminkubectl config use-context kubernetes
注意:
--server
:该项填的是master
节点apiserver
访问IP:PORT
由于是master
节点生成证书,因此上面生成的config
文件会放置到master
节点的/root/.kube
目录下,生成好该证书后,将该证书同步到其他node节点的/root/.kube
目录中。后续安装heapster
及其他服务时会用到。
创建 kubernetes 证书
[root@mimo222 ~]# cd /opt/ssl[root@mimo222 ~]# vi kubernetes-csr.json{ "CN": "kubernetes", "hosts": [ "127.0.0.1", "10.0.11.222", "10.254.0.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "k8s", "OU": "System" } ]}
这里 hosts
字段中三个 IP 分别为 127.0.0.1
本机、172.16.1.64
为 Master
的IP
(多个Master
节点需要将所有master
节点IP
都写在这)、 10.254.0.1
为 kubernetes SVC
的 IP
, 一般是部署网络的第一个IP
, 如: 10.254.0.1
, 在启动完成后,我们使用 kubectl get svc
, 就可以查看到。
生成 kubernetes 证书和私钥
/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/opt/ssl/config.json \ -profile=kubernetes kubernetes-csr.json | /opt/local/cfssl/cfssljson -bare kubernetes
查看生成
[root@kube_master222 ssl]# ll kubernetes*-rw-r--r-- 1 root root 1245 12月 19 14:34 kubernetes.csr-rw-r--r-- 1 root root 437 12月 19 14:25 kubernetes-csr.json-rw------- 1 root root 1675 12月 19 14:34 kubernetes-key.pem-rw-r--r-- 1 root root 1610 12月 19 14:34 kubernetes.pem
拷贝到指定目录
cp kubernetes*.pem /etc/kubernetes/ssl/
配置 kube-apiserver
kubelet
首次启动时向kube-apiserver
发送 TLS Bootstrapping
请求,kube-apiserver
验证 kubelet
请求中的 token
是否与它配置的 token
一致,如果一致则自动为 kubelet
生成证书和秘钥。
# 生成 token(注意此处的token在生成node节点kubelet需要的证书时也会用到,要注意不要写错或重新生成别的)[root@mimo222 ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '3140a1541451afcc87ca7b715f124ce3# 创建 token.csv 文件[root@mimo222 ~]# cd /opt/ssl[root@mimo222 ~]# vi token.csv# 填写以下信息:3140a1541451afcc87ca7b715f124ce3,kubelet-bootstrap,10001,"system:kubelet-bootstrap"# 拷贝cp token.csv /etc/kubernetes/
# 生成高级审核配置文件[root@mimo222 ~]# cd /etc/kubernetescat >> audit-policy.yaml <<EOF# Log all requests at the Metadata level.apiVersion: audit.k8s.io/v1beta1kind: Policyrules:- level: MetadataEOF
创建 kube-apiserver.service 文件
- 自定义 系统 service 文件一般存于
/etc/systemd/system/
下 - 配置为 各自的本地
IP
[root@mimo222 ~]# vi /etc/systemd/system/kube-apiserver.service[Unit]Description=Kubernetes API ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.target[Service]User=rootExecStart=/usr/local/bin/kube-apiserver \ --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \ --advertise-address=10.0.11.222 \ --allow-privileged=true \ --apiserver-count=3 \ --audit-policy-file=/etc/kubernetes/audit-policy.yaml \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/var/log/kubernetes/audit.log \ --authorization-mode=Node,RBAC \ --anonymous-auth=false \ # 不接受匿名访问,若为true,则表示接受,此处设置为false,便于dashboard访问 --bind-address=0.0.0.0 \ --secure-port=6443 \ --client-ca-file=/etc/kubernetes/ssl/ca.pem \ --enable-swagger-ui=true \ --etcd-cafile=/etc/kubernetes/ssl/ca.pem \ --etcd-certfile=/etc/kubernetes/ssl/etcd.pem \ --etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem \ --etcd-servers=https://10.0.11.222:2379 \ --event-ttl=1h \ --kubelet-https=true \ --insecure-bind-address=127.0.0.1 \ --insecure-port=8080 \ --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \ --service-cluster-ip-range=10.254.0.0/16 \ --service-node-port-range=30000-32000 \ --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \ --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \ --enable-bootstrap-token-auth \ --token-auth-file=/etc/kubernetes/token.csv \ --v=2Restart=on-failureRestartSec=5Type=notifyLimitNOFILE=65536[Install]WantedBy=multi-user.target
--advertise-address
:master节点本机IP--etcd-servers:etcd URL
:etcd集群需要写上所有etcd节点 URL--service-node-port-range=30000-32000
:这个地方是 映射外部端口时 的端口范围,随机映射也在这个范围内映射,指定映射端口必须也在这个范围内。注意验证证书等路径是否正确。
启动 kube-apiserver
[root@mimo222 ~]# systemctl daemon-reload[root@mimo222 ~]# systemctl enable kube-apiserver[root@mimo222 ~]# systemctl start kube-apiserver[root@mimo222 ~]# systemctl status kube-apiserver
配置 kube-controller-manager
创建 kube-controller-manager.service
文件
[root@mimo222 ~]# vi /etc/systemd/system/kube-controller-manager.service[Unit]Description=Kubernetes Controller ManagerDocumentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]ExecStart=/usr/local/bin/kube-controller-manager \ --address=0.0.0.0 \ --master=http://127.0.0.1:8080 \ --allocate-node-cidrs=true \ --service-cluster-ip-range=10.254.0.0/16 \ --cluster-cidr=10.233.0.0/16 \ --cluster-name=kubernetes \ --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \ --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \ --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \ --root-ca-file=/etc/kubernetes/ssl/ca.pem \ --leader-elect=true \ --v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
启动 kube-controller-manager
[root@mimo222 ~]# systemctl daemon-reload[root@mimo222 ~]# systemctl enable kube-controller-manager[root@mimo222 ~]# systemctl start kube-controller-manager[root@mimo222 ~]# systemctl status kube-controller-manager
配置 kube-scheduler
创建 kube-cheduler.service
文件
[root@mimo222 ~]# vi /etc/systemd/system/kube-scheduler.service[Unit]Description=Kubernetes SchedulerDocumentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]ExecStart=/usr/local/bin/kube-scheduler \ --address=0.0.0.0 \ --master=http://127.0.0.1:8080 \ --leader-elect=true \ --v=2Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
启动 kube-scheduler
[root@mimo222 ~]# systemctl daemon-reload[root@mimo222 ~]# systemctl enable kube-scheduler[root@mimo222 ~]# systemctl start kube-scheduler[root@mimo222 ~]# systemctl status kube-scheduler
验证 Master 节点
[root@mimo222 ssl]# kubectl get componentstatusesNAME STATUS MESSAGE ERRORscheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"} # 由于还没有加入node节点,所有查询node时为空。[root@mimo222 ssl]# kubectl get nodesNAME STATUS ROLES AGE VERSION
flannel安装配置
kubernetes
要求集群内各节点能通过Pod
网段互联互通,本节介绍使用Flannel
在所有节点 (Master、Node)
上创建互联互通的 Pod
网段的步骤。
创建flannel证书
[root@mimo222 ~]# cd /opt/ssl/[root@mimo222 ~]# vi flanneld-csr.json# 添加如下内容:{ "CN": "flanneld", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "k8s", "OU": "System" } ]}
注意:hosts 字段为空。
生成 flanneld 证书和私钥
[root@mimo222 ~]# cd /opt/ssl[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \ -ca-key=/opt/ssl/ca-key.pem \ -config=/opt/ssl/config.json \ -profile=kubernetes flanneld-csr.json | /opt/local/cfssl/cfssljson -bare flanneld
# 查看生成信息[root@mimo222 ~]# ll flannel*-rw-r--r-- 1 root root 1001 Dec 15 13:59 flanneld.csr-rw-r--r-- 1 root root 223 Dec 15 13:56 flanneld-csr.json-rw------- 1 root root 1679 Dec 15 13:59 flanneld-key.pem-rw-r--r-- 1 root root 1395 Dec 15 13:59 flanneld.pem# 拷贝[root@mimo222 ~]# cp flanneld*.pem /etc/kubernetes/ssl/
向etcd写入集群Pod网段信息
注意:本步骤只需在第一次部署 Flannel 网络时执行,后续在其它节点上部署 Flannel 时无需再写入该信息!
etcdctl --endpoints=https://10.0.11.222:2379 \--ca-file=/opt/ssl/ca.pem \--cert-file=/etc/kubernetes/ssl/flanneld.pem \--key-file=/etc/kubernetes/ssl/flanneld-key.pem \set /kubernetes/network/config '{"Network":"10.233.0.0/16"}'
写入的 Pod
网段({"Network":"10.233.0.0/16"}
) 必须与 kube-controller-manager
的 --cluster-cidr
选项值一致;
下载安装 flanneld
[root@mimo222 ~]# mkdir /tmp/flannel[root@mimo222 ~]# cd /tmp/flannel[root@mimo222 ~]# wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz[root@mimo222 ~]# tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz[root@mimo222 ~]# cp {flanneld,mk-docker-opts.sh} /usr/local/bin
创建启动文件flanneld.service
[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service# 添加以下信息:[Unit]Description=Flanneld overlay address etcd agentAfter=network.targetAfter=network-online.targetWants=network-online.targetAfter=etcd.serviceBefore=docker.service[Service]Type=notifyExecStart=/usr/local/bin/flanneld \ -etcd-cafile=/etc/kubernetes/ssl/ca.pem \ -etcd-certfile=/etc/kubernetes/ssl/flanneld.pem \ -etcd-keyfile=/etc/kubernetes/ssl/flanneld-key.pem \ -etcd-endpoints=https://10.0.11.222:2379 \ -etcd-prefix=/kubernetes/networkExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/dockerRestart=on-failure[Install]WantedBy=multi-user.targetRequiredBy=docker.service
-etcd-endpoints
:填写etcd
配置的URL
,注意使用https
。-etcd-prefix
:上面第一步设置的Pod
网段key
前缀。我设置的key
为/kubernetes/network/config
,因此前缀为/kubernetes/network
。注意CA验证证书的路径是否正确。
启动 flanneld
[root@mimo222 ~]# systemctl daemon-reload [root@mimo222 ~]# systemctl enable flanneld[root@mimo222 ~]# systemctl start flanneld[root@mimo222 ~]# systemctl status flanneld
查看ETCD中flannel集群 Pod 网段
对于该命令及下面的命令,--endpoints
参数后跟的是etcd
集群IP:PORT
(多个etcd
节点需填多个IP:PORT
),/kubernetes/network
是我这里设置的FLANNEL_ETCD_PREFIX
,因此大家可根据自己设置的flannel etcd 前缀
来填写。--ca-file
、--cert-file
、--key-file
是指相应flannel证书路径,若没有采用CA验证,则不需要。
etcdctl --endpoints=https://10.0.11.222:2379 \--ca-file=/opt/ssl/ca.pem \--cert-file=/etc/kubernetes/ssl/flanneld.pem \--key-file=/etc/kubernetes/ssl/flanneld-key.pem \get /kubernetes/network/config{"Network":"10.233.0.0/16"}
查看已分配的 Pod 子网段列表
etcdctl --endpoints=https://10.0.11.222:2379 \--ca-file=/opt/ssl/ca.pem \--cert-file=/etc/kubernetes/ssl/flanneld.pem \--key-file=/etc/kubernetes/ssl/flanneld-key.pem \ls /kubernetes/network/subnets/kubernetes/network/subnets/10.233.50.0-24/kubernetes/network/subnets/10.233.86.0-24
查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数
etcdctl --endpoints=https://10.0.11.222:2379 \--ca-file=/opt/ssl/ca.pem \--cert-file=/etc/kubernetes/ssl/flanneld.pem \--key-file=/etc/kubernetes/ssl/flanneld-key.pem \get /kubernetes/network/subnets/10.233.50.0-24{"PublicIP":"10.0.11.221"}
确保各节点间 Pod 网段能互联互通
在各节点上部署完 Flannel 后,根据上面命令查看已分配的 Pod 子网段列表(此处是我分配的网段列表):
/kubernetes/network/subnets/10.233.50.0-24/kubernetes/network/subnets/10.233.86.0-24
在各节点上分配 ping 这两个网段的网关地址,确保能通:
ping 10.233.50.1ping 10.233.86.1
Kubernetes Node节点安装配置
kubernetes node
节点需要安装kubelet
、kube-proxy
、flannel
。下面的配置步骤,指明在master节点执行的需要在master节点执行,没有指明的在node节点执行。
配置 kubelet(Master节点执行)
kubelet
启动时向 kube-apiserver
发送 TLS bootstrapping
请求,需要先将 bootstrap token
文件中的 kubelet-bootstrap
用户赋予 system:node-bootstrapper
角色,然后 kubelet
才有权限创建认证请求(certificatesigningrequests)
。
# 先创建认证请求# user 为 master 中 token.csv 文件里配置的用户# 只需创建一次就可以kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
创建 kubelet kubeconfig 文件(Master节点执行)
# 配置集群(server要写master ip地址,不要使用127.0.0.1或localhost,否则node节点无法识别)kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://10.0.11.222:6443 \ --kubeconfig=bootstrap.kubeconfig# 配置客户端认证(此处的token使用token.csv中的token)kubectl config set-credentials kubelet-bootstrap \ --token=3140a1541451afcc87ca7b715f124ce3 \ --kubeconfig=bootstrap.kubeconfig# 配置关联kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig# 配置默认关联kubectl config use-context default --kubeconfig=bootstrap.kubeconfig# 拷贝生成的 bootstrap.kubeconfig 文件mv bootstrap.kubeconfig /etc/kubernetes/
创建 kube-proxy 证书(Master节点执行)
[root@mimo222 ~]# cd /opt/ssl[root@mimo222 ~]# vi kube-proxy-csr.json{ "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "TianJin", "L": "TianJin", "O": "k8s", "OU": "System" } ]}
生成 kube-proxy 证书和私钥(Master节点执行)
/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/opt/ssl/config.json \ -profile=kubernetes kube-proxy-csr.json | /opt/local/cfssl/cfssljson -bare kube-proxy# 查看生成[root@mimo222 ssl]# ll kube-proxy*-rw-r--r-- 1 root root 1013 Dec 14 20:09 kube-proxy.csr-rw-r--r-- 1 root root 232 Dec 14 20:09 kube-proxy-csr.json-rw------- 1 root root 1679 Dec 14 20:09 kube-proxy-key.pem-rw-r--r-- 1 root root 1407 Dec 14 20:09 kube-proxy.pem# 拷贝到目录cp kube-proxy*.pem /etc/kubernetes/ssl/
创建 kube-proxy kubeconfig 文件(Master节点执行)
# 配置集群(server要写master ip地址,不要使用127.0.0.1或localhost,否则node节点无法识别)kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://10.0.11.222:6443 \ --kubeconfig=kube-proxy.kubeconfig# 配置客户端认证(注意证书路径)kubectl config set-credentials kube-proxy \ --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \ --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig# 配置关联kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig# 配置默认关联kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig# 拷贝到目录mv kube-proxy.kubeconfig /etc/kubernetes/
从master节点拷贝证书
所有需要的证书生成最好都在master节点进行生成,然后统一管理,node
节点需要哪些,直接从master
拷贝即可。
[root@mimo222 ~]# mkdir -p /etc/kubernetes/ssl/[root@mimo222 ~]# cd /etc/kubernetes/# kubelet kubeconfig 文件[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/bootstrap.kubeconfig ./# kube-proxy kubeconfig 文件[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/kube-proxy.kubeconfig ./[root@mimo222 ~]# cd /etc/kubernetes/ssl# kubernetes相关证书[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/ca.pem ./[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/kube-proxy.pem ./[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/kube-proxy-key.pem ./# flannel证书[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/flanneld-key.pem ./[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/flanneld.pem ./
下载 flanneld
[root@mimo222 ~]# mkdir /tmp/flannel[root@mimo222 ~]# cd /tmp/flannel[root@mimo222 ~]# wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz[root@mimo222 ~]# tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz[root@mimo222 ~]# cp {flanneld,mk-docker-opts.sh} /usr/local/bin
配置并启动flanneld
创建启动文件flanneld.service
:
[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service# 添加以下信息:[Unit]Description=Flanneld overlay address etcd agentAfter=network.targetAfter=network-online.targetWants=network-online.targetAfter=etcd.serviceBefore=docker.service[Service]Type=notifyExecStart=/usr/local/bin/flanneld \ -etcd-cafile=/etc/kubernetes/ssl/ca.pem \ -etcd-certfile=/etc/kubernetes/ssl/flanneld.pem \ -etcd-keyfile=/etc/kubernetes/ssl/flanneld-key.pem \ -etcd-endpoints=https://10.0.11.222:2379 \ -etcd-prefix=/kubernetes/networkExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/dockerRestart=on-failure[Install]WantedBy=multi-user.targetRequiredBy=docker.service
-etcd-endpoints
:填写etcd
配置的URL
,注意使用https
。-etcd-prefix
:上面第一步设置的Pod
网段key前缀。我设置的key
为/kubernetes/network/config
,因此前缀为/kubernetes/network
。注意
CA
验证证书的路径是否正确。
启动 flanneld
:
[root@mimo222 ~]# systemctl daemon-reload [root@mimo222 ~]# systemctl enable flanneld[root@mimo222 ~]# systemctl start flanneld[root@mimo222 ~]# systemctl status flanneld
安装kubelet、kube-proxy
[root@mimo222 ~]# cd /tmp/kubernetes# master节点安装时使用过这个文件,拷到node节点即可[root@mimo222 ~]# wget https://dl.k8s.io/v1.8.3/kubernetes-server-linux-amd64.tar.gz[root@mimo222 ~]# tar -xzvf kubernetes-server-linux-amd64.tar.gz[root@mimo222 ~]# cd kubernetes[root@mimo222 ~]# cp -r server/bin/{kube-proxy,kubelet} /usr/local/bin/
配置 kubelet.service 文件
[root@mimo222 ~]# mkdir /var/lib/kubelet[root@mimo222 ~]# vi /etc/systemd/system/kubelet.service[Unit]Description=Kubernetes KubeletDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=docker.serviceRequires=docker.service[Service]WorkingDirectory=/var/lib/kubeletExecStart=/usr/local/bin/kubelet \ --cgroup-driver=cgroupfs \ --hostname-override=10.0.11.221 \ --pod-infra-container-image=jicki/pause-amd64:3.0 \ --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --cert-dir=/etc/kubernetes/ssl \ --cluster_dns=10.254.0.2 \ --cluster_domain=cluster.local. \ --hairpin-mode promiscuous-bridge \ --allow-privileged=true \ --fail-swap-on=false \ --serialize-image-pulls=false \ --logtostderr=true \ --max-pods=512 \ --v=2[Install]WantedBy=multi-user.target
--pod-infra-container-image
:该项配置的是pod启动时需要一块启动的pod-infrastructure
镜像,真实使用时最好将该文件下载到本地私有库,然后将该项配置成私有库的pod-infrastructure
镜像下载地址。--kubeconfig
:kubelet
启动成功之后自动生成的kubelet.kubeconfig
文件保存路径。
启动 kubelet
[root@mimo222 ~]# systemctl daemon-reload[root@mimo222 ~]# systemctl enable kubelet[root@mimo222 ~]# systemctl start kubelet[root@mimo222 ~]# systemctl status kubelet# 如果报错 请使用journalctl -f -t kubelet 和 journalctl -u kubelet 来定位问题
配置 TLS 认证(Master节点执行)
此步骤很重要,当node
节点安装好kubelet
之后,首次启动,会请求master
节点的apiserver
,此时会生成一个csr
,可根据kubectl get csr
查看。只有master
节点认证了该csr
之后,node
节点才能够真正与master
建立通信,完成认证。否则node
节点与master
节点无法交互。
# 查看 csr 的名称[root@mimo222 ~]# kubectl get csrNAME AGE REQUESTOR CONDITIONnode-csr-A9WKNWyqyq89XOwg-uqCu2C4fBQEhOhzmlQJ6f8VPWE 22h kubelet-bootstrap Approved,Issuednode-csr-J1W94p6S2w0fjTkvpdfG0J-lRY-dmkVFH01OG3R6T4Y 3h kubelet-bootstrap Approved,Issuednode-csr-aVIfz5k6GX5jy31z43ZkhxzzLfkFtMUoAkJTi1Okcx8 3h kubelet-bootstrap Pending# 若CONDITION显示为Pending,可增加认证# 下面的语句是将所有Pending状态的csr设置已认证kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve
验证 nodes(Master节点执行)
kubectl get nodesNAME STATUS ROLES AGE VERSION10.0.11.221 Ready <none> 3h v1.8.3
node节点验证
kubelet
启动成功之后,会请求apiserver
,通过验证,node
节点本地机器会自动生成配置文件与密钥,查看/etc/kubernetes
[root@mimo221 kubernetes]# ll-rw-------. 1 root root 2195 Dec 15 10:27 bootstrap.kubeconfig-rw-------. 1 root root 2286 Dec 15 15:43 kubelet.kubeconfig-rw-------. 1 root root 6305 Dec 15 10:28 kube-proxy.kubeconfigdrwxr-xr-x. 2 root root 202 Dec 15 15:43 ssl[root@mimo221 kubernetes]# ll ssl |grep kubelet-rw-r--r--. 1 root root 1046 Dec 15 15:43 kubelet-client.crt-rw-------. 1 root root 227 Dec 15 15:38 kubelet-client.key-rw-r--r--. 1 root root 1111 Dec 15 15:38 kubelet.crt-rw-------. 1 root root 1675 Dec 15 15:38 kubelet.key
配置kube-proxy.service 文件
[root@mimo221 kubernetes]# mkdir -p /var/lib/kube-proxy[root@mimo221 kubernetes]# vi /etc/systemd/system/kube-proxy.service[Unit]Description=Kubernetes Kube-Proxy ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.target[Service]WorkingDirectory=/var/lib/kube-proxyExecStart=/usr/local/bin/kube-proxy \ --bind-address=0.0.0.0 \ --hostname-override=10.0.11.221 \ --cluster-cidr=10.254.0.0/16 \ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ --logtostderr=true \ --v=2Restart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.target
--hostname-override
:要于kubelet
配置文件中的--hostname-override
值一致。
启动 kube-proxy
[root@mimo221 kubernetes]# systemctl daemon-reload[root@mimo221 kubernetes]# systemctl enable kube-proxy[root@mimo221 kubernetes]# systemctl start kube-proxy[root@mimo221 kubernetes]# systemctl status kube-proxy# 如果报错 请使用journalctl -f -t kube-proxy 和 journalctl -u kube-proxy 来定位问题
kubernetes DNS安装及配置
官方 github yaml 相关 https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns
下载镜像
# 官方镜像gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.7gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.7# 国内用的这位大神的镜像jicki/k8s-dns-sidecar-amd64:1.14.7jicki/k8s-dns-kube-dns-amd64:1.14.7jicki/k8s-dns-dnsmasq-nanny-amd64:1.14.7
下载 yaml 文件
curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kube-dns.yaml.base# 去掉后缀mv kube-dns.yaml.base kube-dns.yaml
修改 kube-dns.yaml
1. # clusterIP: __PILLAR__DNS__SERVER__ 修改为我们之前定义的 dns IP 10.254.0.22. # 修改 --domain=__PILLAR__DNS__DOMAIN__. 为 我们之前 预定的 domain 名称 --domain=cluster.local.3. # 修改 --server=/__PILLAR__DNS__DOMAIN__/127.0.0.1#10053 中 domain 为我们之前预定的 --server=/cluster.local./127.0.0.1#100534. # 修改 --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__, 中的 domain 为我们之前预定的 --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5. # 修改 --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__, 中的 domain 为我们之前预定的 --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,6. # 修改三个镜像下载地址,我这里将镜像存入了本地的私有库,所以直接从私有库中下载,大家也可以使用上面的国内镜像。建议存到本地私有库。
下面给出我这里的yaml
配置文件详情:
apiVersion: v1kind: Servicemetadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: "KubeDNS"spec: selector: k8s-app: kube-dns clusterIP: 10.254.0.2 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP---apiVersion: v1kind: ServiceAccountmetadata: name: kube-dns namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile---apiVersion: v1kind: ConfigMapmetadata: name: kube-dns namespace: kube-system labels: addonmanager.kubernetes.io/mode: EnsureExists---apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcilespec: strategy: rollingUpdate: maxSurge: 10% maxUnavailable: 0 selector: matchLabels: k8s-app: kube-dns template: metadata: labels: k8s-app: kube-dns annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: tolerations: - key: "CriticalAddonsOnly" operator: "Exists" volumes: - name: kube-dns-config configMap: name: kube-dns optional: true containers: - name: kubedns image: 10.0.11.222:5000/bigdata/k8s-dns-kube-dns-amd64:1.14.7 resources: limits: memory: 170Mi requests: cpu: 100m memory: 70Mi livenessProbe: httpGet: path: /healthcheck/kubedns port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /readiness port: 8081 scheme: HTTP # we poll on pod startup for the Kubernetes master service and # only setup the /readiness HTTP server once that's available. initialDelaySeconds: 3 timeoutSeconds: 5 args: - --domain=cluster.local. - --dns-port=10053 - --config-dir=/kube-dns-config - --v=2 env: - name: PROMETHEUS_PORT value: "10055" ports: - containerPort: 10053 name: dns-local protocol: UDP - containerPort: 10053 name: dns-tcp-local protocol: TCP - containerPort: 10055 name: metrics protocol: TCP volumeMounts: - name: kube-dns-config mountPath: /kube-dns-config - name: dnsmasq image: 10.0.11.222:5000/bigdata/k8s-dns-dnsmasq-nanny-amd64:1.14.7 livenessProbe: httpGet: path: /healthcheck/dnsmasq port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 args: - -v=2 - -logtostderr - -configDir=/etc/k8s/dns/dnsmasq-nanny - -restartDnsmasq=true - -- - -k - --cache-size=1000 - --no-negcache - --log-facility=- - --server=/cluster.local./127.0.0.1#10053 - --server=/in-addr.arpa/127.0.0.1#10053 - --server=/ip6.arpa/127.0.0.1#10053 ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP resources: requests: cpu: 150m memory: 20Mi volumeMounts: - name: kube-dns-config mountPath: /etc/k8s/dns/dnsmasq-nanny - name: sidecar image: 10.0.11.222:5000/bigdata/k8s-dns-sidecar-amd64:1.14.7 livenessProbe: httpGet: path: /metrics port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 args: - --v=2 - --logtostderr - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,SRV - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,SRV ports: - containerPort: 10054 name: metrics protocol: TCP resources: requests: memory: 20Mi cpu: 10m dnsPolicy: Default serviceAccountName: kube-dns
导入kubedns服务
[root@mimo222 kube_dns] kubectl create -f kube-dns.yamlservice "kube-dns" createdserviceaccount "kube-dns" createdconfigmap "kube-dns" createddeployment "kube-dns" created
查看 kubedns 服务
[root@mimo222 kube_dns]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEkube-dns-7778f5bf49-l5xsk 3/3 Running 0 40mkubernetes-dashboard-77bd6c79b-trcbg 1/1 Running 0 34m
配置 dns 自动扩容
# 官方镜像gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.1.2-r2# 国内镜像jicki/cluster-proportional-autoscaler-amd64:1.1.2-r2
下载 dns自动扩容镜像 yaml
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml将yaml文件中的镜像下载地址更换一下即可,其他不需要修改
导入自动扩容服务
[root@mimo222 kube_dns]# kubectl apply -f dns-horizontal-autoscaler.yaml serviceaccount "kube-dns-autoscaler" createdclusterrole "system:kube-dns-autoscaler" createdclusterrolebinding "system:kube-dns-autoscaler" createddeployment "kube-dns-autoscaler" created
查看服务
[root@mimo222 kube_dns]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEkube-dns-7778f5bf49-l5xsk 3/3 Running 0 40mkube-dns-autoscaler-84cb69d467-6dph4 1/1 Running 0 35mkubernetes-dashboard-77bd6c79b-trcbg 1/1 Running 0 34m
验证dns服务
# 创建pod, pod-busybox.yamlapiVersion: v1kind: Podmetadata: name: busybox namespace: defaultspec: containers: - image: busybox command: - sleep - "3600" imagePullPolicy: IfNotPresent name: busybox restartPolicy: Always# 登录busybox容器内部kubectl exec -it busybox -- /bin/sh# 输入命令认证nslookup kubernetes# 输出结果:Server: 10.254.0.2Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.localName: kubernetesAddress 1: 10.254.0.1 kubernetes.default.svc.cluster.local
到此如果都没有报错的话,说明kubernetes1.8.3
集群安装成功了。
- Kubernetes1.8.3 集群环境搭建(CentOS)
- Docker Kubernetes1.5.2集群环境搭建(CentOS)
- 环境搭建-CentOS集群搭建
- 手动搭建Kubernetes1.8高可用集群(1)ETCD
- 手动搭建Kubernetes1.8高可用集群(3)Docker
- 手动搭建Kubernetes1.8高可用集群(4)Master
- 手动搭建Kubernetes1.8高可用集群(5)Node
- 手动搭建Kubernetes1.8高可用集群(6)calico
- 手动搭建Kubernetes1.8高可用集群(7)dnsmasq
- zookeeper集群环境搭建(centos)
- CentOS搭建分布式集群环境
- 2.环境搭建-CentOS集群搭建
- centos ruby环境安装(redis集群搭建 )
- 一.Zookeeper三节点集群环境搭建(centOS)
- CentOS环境下zookeeper集群的搭建
- CentOS环境下elasticsearch集群搭建
- Centos 6.x Hadoop集群环境搭建
- CentOS环境搭建zookeeper集群篇
- C#: IEnumerable
- SSIS学习(四)
- 测试技术专家需要具备的特性
- 【回味C】循环
- 一招制敌
- Kubernetes1.8.3 集群环境搭建(CentOS)
- 动态规划算法
- FXhome HitFilm Pro 6(顶级视频剪辑合成工具)官方破解版V6.1.7208.42532下载 | fxhome hitfilm 6 pro
- 中文姓名转拼音生产特定格式
- JDBC规范——(3)新特性
- 几款Web服务器性能压力测试工具
- 通过反射机制为ViewPager设置滑动效果
- 如何用 JS 创建一个时钟呢
- 机器学习技法-Decision Tree