Kubernetes1.8.3 集群环境搭建(CentOS)

部署环境

此次部署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配置项修改为disabled
SELINUX=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 -lt
total 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 version

Client:
 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/amd64

Server:
 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 Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify

ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS $DOCKER_DNS_OPTIONS

# 添加这行操作,在每次重启docker之前都会设置iptables策略为ACCEPT
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT

ExecReload=/bin/kill -s HUP $MAINPID

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

对比初始安装docker后的docker.service文件内容,修改docker.service文件。

Docker1.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"

--graph=/opt/docker: 此项设置的是docker运行之后创建的容器、数据卷等信息的保存路径,数据量可能会很大,因此最好放置到容量大的目录,可根据自己需要设置。

--insecure-registry 10.0.11.222:5000:这个是我本地私有镜像库地址,大家根据自己需要修改。

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sockSwarm集群需要的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安装配置

etcdkubernetes集群最重要的组件, 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-health

member 2012db49e3efb509 is healthy: got healthy result from https://10.0.11.222:2379
cluster 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 list

2012db49e3efb509: 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证书

kubectlkube-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.pem


kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin


kubectl 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.64MasterIP(多个Master节点需要将所有master节点IP都写在这)、 10.254.0.1kubernetes SVCIP, 一般是部署网络的第一个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/kubernetes

cat >> audit-policy.yaml <# Log all requests at the Metadata level.
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
- level: Metadata
EOF

创建 kube-apiserver.service 文件

  • 自定义 系统 service 文件一般存于 /etc/systemd/system/
  • 配置为 各自的本地IP
[root@mimo222 ~]# vi /etc/systemd/system/kube-apiserver.service


[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
User=root
ExecStart=/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 \
  --basic-auth-file=/etc/kubernetes/basic_auth_file \
  --v=2
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  1. --advertise-address:master节点本机IP

  2. --etcd-servers:etcd URL:etcd集群需要写上所有etcd节点 URL

  3. --service-node-port-range=30000-32000:这个地方是 映射外部端口时 的端口范围,随机映射也在这个范围内映射,指定映射端口必须也在这个范围内。

  4. 注意验证证书等路径是否正确。

  5. --basic-auth-file=/etc/kubernetes/basic_auth_file : 基础验证文件,通过配置该文件,则访问后台管理页面时会需要输入用户名密码登录,保证安全。下面是basic_auth_file的文件结构:

mimoAdmin,admin,admin,该文件中只需要写入这三个配置项即可,这三项含义分别为:密码,用户名,ID

启动 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 Manager
Documentation=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=2
Restart=on-failure
RestartSec=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 Scheduler
Documentation=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=2
Restart=on-failure
RestartSec=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 componentstatuses
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"} 


# 由于还没有加入node节点,所有查询node时为空。

[root@mimo222 ssl]# kubectl get nodes
NAME          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 agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/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/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
  1. -etcd-endpoints :填写etcd配置的URL,注意使用https

  2. -etcd-prefix:上面第一步设置的Pod网段key前缀。我设置的key/kubernetes/network/config,因此前缀为/kubernetes/network

  3. 注意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.1

ping 10.233.86.1

Kubernetes Node节点安装配置

kubernetes node节点需要安装kubeletkube-proxyflannel下面的配置步骤,指明在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 agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/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/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
  1. -etcd-endpoints :填写etcd配置的URL,注意使用https

  2. -etcd-prefix:上面第一步设置的Pod网段key前缀。我设置的key/kubernetes/network/config,因此前缀为/kubernetes/network

  3. 注意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 Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/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
  1. --pod-infra-container-image:该项配置的是pod启动时需要一块启动的pod-infrastructure镜像,真实使用时最好将该文件下载到本地私有库,然后将该项配置成私有库的pod-infrastructure镜像下载地址。

  2. --kubeconfigkubelet启动成功之后自动生成的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 csr

NAME                                                   AGE       REQUESTOR           CONDITION
node-csr-A9WKNWyqyq89XOwg-uqCu2C4fBQEhOhzmlQJ6f8VPWE   22h       kubelet-bootstrap   Approved,Issued
node-csr-J1W94p6S2w0fjTkvpdfG0J-lRY-dmkVFH01OG3R6T4Y   3h        kubelet-bootstrap   Approved,Issued
node-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 nodes

NAME          STATUS    ROLES     AGE       VERSION
10.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.kubeconfig
drwxr-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 Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/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=2
Restart=on-failure
RestartSec=5
LimitNOFILE=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.7
gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.7


# 国内用的这位大神的镜像
jicki/k8s-dns-sidecar-amd64:1.14.7
jicki/k8s-dns-kube-dns-amd64:1.14.7
jicki/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.2

2. # 修改 --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#10053

4. # 修改 --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: v1
kind: Service
metadata:
  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: v1
kind: ServiceAccount
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  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.yaml

service "kube-dns" created
serviceaccount "kube-dns" created
configmap "kube-dns" created
deployment "kube-dns" created

查看 kubedns 服务

[root@mimo222 kube_dns]# kubectl get pods -n kube-system

NAME                                   READY     STATUS    RESTARTS   AGE
kube-dns-7778f5bf49-l5xsk              3/3       Running   0          40m
kubernetes-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" created
clusterrole "system:kube-dns-autoscaler" created
clusterrolebinding "system:kube-dns-autoscaler" created
deployment "kube-dns-autoscaler" created

查看服务

[root@mimo222 kube_dns]# kubectl get pods -n kube-system

NAME                                   READY     STATUS    RESTARTS   AGE
kube-dns-7778f5bf49-l5xsk              3/3       Running   0          40m
kube-dns-autoscaler-84cb69d467-6dph4   1/1       Running   0          35m
kubernetes-dashboard-77bd6c79b-trcbg   1/1       Running   0          34m

验证dns服务

# 创建pod, pod-busybox.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  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.2
Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.254.0.1 kubernetes.default.svc.cluster.local

到此如果都没有报错的话,说明kubernetes1.8.3集群安装成功了。

你可能感兴趣的:(Docker)