k8s-1-13二进制安装部署
环境规划
系统:centos7 +docker18.09+k8s 1.13 +etcd3.3.10+flanneld0.10
IP地址规划
节点 | IP | 功能 |
---|---|---|
node1 | 192.168.57.13 | kube-apiserver etcd kube-controller-manager kube-scheduler |
node2 | 192.168.57.14 | kubelet kube-proxy etcd flanneld docker |
node3 | 192.168.57.15 | kubelet kube-proxy etcd flanneld docker |
目录规划
mkdir /opt/{etcd,kubernetes}/{bin,ssl,cfg} -p
1.MASTER部署
证书生成:
1.1 软件下载
curl -L http://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L http://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L http://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
1.2 etcd证书生成
ca配置
cat << EOF tee ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"etcd": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
ca证书制作
cat << EOF tee ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
cfssl gencert -initca ca-csr.json cfssljson -bare ca
server证书制作,hosts配置为要安装etcd服务的主机IP地址
cat << EOF tee server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.57.13",
"192.168.57.14",
"192.168.57.15"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json cfssljson -bare server
拷贝生成的所有pem文件到要安装etcd服务的主机/opt/etcd/ssl/目录下
scp *.pem node2:/opt/etcd/ssl/
scp *.pem node3:/opt/etcd/ssl/
cp *.pem /opt/etcd/ssl/
1.3 etcd 安装
tar xvf etcd-v3.3.10-linux-amd64.tar.gz
cd etcd-v3.3.10-linux-amd64
scp etcd etcdctl node2:/opt/etcd/bin/
scp etcd etcdctl node3:/opt/etcd/bin/
mv etcd etcdctl /opt/etcd/bin/
etcd配置文件详细内容,对应的主机请修改name及ip地址,以下是etcd01的配置
vim /opt/etcd/cfg/etcd.conf
[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data1/etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.57.13:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.57.13:2379"
[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.57.13:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.57.13:2379"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.57.13:2380,etcd02=http://192.168.57.14:2380,etcd03=http://192.168.57.15:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[Security]
ETCD_CERT_FILE="/opt/etcd/ssl/server.pem"
ETCD_KEY_FILE="/opt/etcd/ssl/server-key.pem"
ETCD_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_PEER_CERT_FILE="/opt/etcd/ssl/server.pem"
ETCD_PEER_KEY_FILE="/opt/etcd/ssl/server-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
etcd 服务配置详细内容
vim /usr/lib/systemd/system/etcd.service
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/data1/etcd/
EnvironmentFile=-/opt/etcd/cfg/etcd.conf
##### set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/etcd/bin/etcd
--name="${ETCD_NAME}" \
--data-dir="${ETCD_DATA_DIR}" \
--listen-client-urls="${ETCD_LISTEN_CLIENT_URLS}" \
--listen-peer-urls="${ETCD_LISTEN_PEER_URLS}" \
--advertise-client-urls="${ETCD_ADVERTISE_CLIENT_URLS}" \
--initial-cluster-token="${ETCD_INITIAL_CLUSTER_TOKEN}" \
--initial-cluster="${ETCD_INITIAL_CLUSTER}" \
--initial-cluster-state="${ETCD_INITIAL_CLUSTER_STATE}" \
--cert-file="${ETCD_CERT_FILE}" \
--key-file="${ETCD_KEY_FILE}" \
--trusted-ca-file="${ETCD_TRUSTED_CA_FILE}" \
--client-cert-auth="${ETCD_CLIENT_CERT_AUTH}" \
--peer-cert-file="${ETCD_PEER_CERT_FILE}" \
--peer-key-file="${ETCD_PEER_KEY_FILE}" \
--peer-trusted-ca-file="${ETCD_PEER_TRUSTED_CA_FILE}" \
--peer-client-cert-auth="${ETCD_PEER_CLIENT_CERT_AUTH}""
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
拷贝到其他主机,注意修改对应主机的ip和name
scp /usr/lib/systemd/system/etcd.service node2:/usr/lib/systemd/system/etcd.service
scp /usr/lib/systemd/system/etcd.service node3:/usr/lib/systemd/system/etcd.service
scp /opt/etcd/cfg/etcd.conf node2:/opt/etcd/cfg/etcd.conf
scp /opt/etcd/cfg/etcd.conf node3:/opt/etcd/cfg/etcd.conf
启动etcd服务,查看健康状态
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
export PATH=$PATH:/opt/etcd/bin/:/opt/kubernetes/bin/
etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints="http://192.168.57.13:2379,http://192.168.57.14:2379,http://192.168.57.15:2379" cluster-health
member 36513deb10729932 is healthy: got healthy result from http://192.168.57.13:2379
member 4dc1cf72420494f7 is healthy: got healthy result from http://192.168.57.14:2379
member cb3821c5c48fcd62 is healthy: got healthy result from http://192.168.57.15:2379
cluster is healthy
1.4 k8s证书制作
ca配置
cat << EOF tee ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
ca证书制作
cat << EOF tee ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json cfssljson -bare ca -
制作apiserver证书
cat << EOF tee server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.254.0.1",
"127.0.0.1",
"192.168.57.13",
"192.168.57.14",
"192.168.57.15",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json cfssljson -bare server
制作kube-proxy证书
cat << EOF tee kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json cfssljson -bare kube-proxy
拷贝所有pem文件到 /opt/kubernetes/ssl/
cp *.pem /opt/kubernetes/ssl/
1.5 部署kube-apiserver
tar -zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
cp kube-scheduler kube-apiserver kube-controller-manager kubectl /opt/kubernetes/bin/
创建token
head -c 16 /dev/urandom od -An -t x tr -d ' '
f01405245c53ec55ea3967e30e3d7019
vim /opt/kubernetes/cfg/token.csv
f01405245c53ec55ea3967e30e3d7019,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
创建apiserver配置文件
[root@node1 ssl]# vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=http://192.168.57.13:2379,http://192.168.57.14:2379,http://192.168.57.15:2379 \
--bind-address=192.168.57.13 \
--secure-port=6443 \
--advertise-address=192.168.57.13 \
--allow-privileged=true \
--service-cluster-ip-range=10.254.0.0/16 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth \
--token-auth-file=/opt/kubernetes/cfg/token.csv \
--service-node-port-range=30000-50000 \
--tls-cert-file=/opt/kubernetes/ssl/server.pem \
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem"
创建apiserver system文件
vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=http://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动apiserver
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
1.6 部署kube-scheduler组件
创建kube-scheduler配置文件
vim /opt/kubernetes/cfg/kube-scheduler
KUBE_SCHEDULER_OPTS="--logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect"
创建kube-scheduler system文件
vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=http://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动kube-scheduler
systemctl daemon-reload
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
1.7 部署kube-controller-manager组件
创建kube-controller-manager配置文件
vim /opt/kubernetes/cfg/kube-controller-manager
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true \
--v=4 \
--master=127.0.0.1:8080 \
--leader-elect=true \
--address=127.0.0.1 \
--service-cluster-ip-range=10.254.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \
--root-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem"
创建kube-controller-manager system文件
vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=http://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动kube-controller-manager
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
1.8 验证服务状态
[root@node1 ssl]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
2. node节点安装
2.1 docker安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
2.2 操作在master节点执行,拷贝证书到node节点,并制作bootstrap.kubectlconfig
vim /opt/kubernetes/cfg/environment.sh
#!/bin/bash
#创建kubelet bootstrapping kubeconfig
BOOTSTRAP_TOKEN=f01405245c53ec55ea3967e30e3d7019
KUBE_APISERVER="http://192.168.57.13:6443"
#设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
#设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=/opt/kubernetes/ssl/kube-proxy.pem \
--client-key=/opt/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
sh environment.sh 执行此脚本会生成两个文件 拷贝到node节点上
bootstrap.kubeconfig environment.sh kube-proxy.kubeconfig
2.3 将kubelet-bootstrap用户绑定到系统集群角色
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
2.4 创建kubelet参数配置模板文件,操作在node节点上执行,对应的ip地址为node节点的ip
vim /opt/kubernetes/cfg/kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.57.14
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS: ["10.254.0.10"]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
2.5 安装kubelet
拷贝kube-proxy 和kubelet到node节点
tar xvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin
scp kubelet kube-proxy node2:/opt/kubernetes/bin/
scp kubelet kube-proxy node3:/opt/kubernetes/bin/
创建kubelet配置文件
vim /opt/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.57.14 \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
创建system文件
vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
2.6 安装kube-proxy
创建kube-proxy配置文件
vim /opt/kubernetes/cfg/kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.57.14 \
--cluster-cidr=10.254.0.0/16 \
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
创建system文件
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable kube-proxy
systemctl start kube-proxy
2.7 查看csr并接受
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-ij3py9j-yi-eoa8sOHMDs7VeTQtMv0N3Efj3ByZLMdc 102s kubelet-bootstrap Pending
kubectl certificate approve node-csr-ij3py9j-yi-eoa8sOHMDs7VeTQtMv0N3Efj3ByZLMdc
certificatesigningrequest.certificates.k8s.io/node-csr-ij3py9j-yi-eoa8sOHMDs7VeTQtMv0N3Efj3ByZLMdc approved
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-ij3py9j-yi-eoa8sOHMDs7VeTQtMv0N3Efj3ByZLMdc 5m13s kubelet-bootstrap Approved,Issued
2.8 查看node
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.57.14 Ready <none> 9m15s v1.13.1
3. flannel安装
3.1 注册网段
etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints="http://192.168.57.13:2379,http://192.168.57.14:2379,http://192.168.57.15:2379" set /k8s/network/config '{ "Network": "10.254.0.0/16", "Backend": {"Type": "vxlan"}}'
3.2 解压安装文件
tar -xvf flannel-v0.10.0-linux-amd64.tar.gz
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/
3.3 配置文件
[root@node2 ~]# cat /opt/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=http://192.168.57.13:2379,http://192.168.57.14:2379,http://192.168.57.15:2379 \
-etcd-cafile=/opt/etcd/ssl/ca.pem \
-etcd-certfile=/opt/etcd/ssl/server.pem \
-etcd-keyfile=/opt/etcd/ssl/server-key.pem \
-etcd-prefix=/k8s/network \
-iface=enp0s8 " #指定使用那块网卡做桥接
3.4 system文件
[root@node2 ~]# cat /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
3.5 docker相关配置
vim /usr/lib/systemd/system/docker.service
删除原来的ExecStart这一行修改为以下两行
3.6 启动服务
systemctl daemon-reload
systemctl start flanneld
systemctl enable flanneld
systemctl start docker
systemctl restart kubelet
systemctl restart kube-proxy
查看网段
[root@node2 ~]# cat /run/flannel/subnet.env
DOCKER_OPT_BIP="--bip=10.254.73.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=10.254.73.1/24 --ip-masq=false --mtu=1450"
k8s-1-13二进制安装部署
http://www.jcwit.com/article/175/