How to install a kubernetes cluster from Scratch(offline). (由于时间久远,此文仅做参考使用)
kubernetes install offline step by step
概述:
此文档用于在ubuntu16.04上独立安装kubernetes节点 api-server与kubelet、kube-proxy之间通过tls认证交互 control-manager和scheduler通过api-server在本地暴露的127.0.0.1:8080交互
备注:
未实现HA模式 ,实现HA模式,官方的文档https://kubernetes.io/docs/admin/high-availability/里指明:需要etcd实现集群模式,apiserver是无状态的,在master节点上正常启动,利用云上的lb做负载均衡,感觉dns也行,注意证书问题就可以。,kube-controller-manager,kube-scheduler需要保证同时只有一个实例在work启动加上–leader-elect启动参数。
etcd组件说明:
port:
127.0.0.1:2379: listen-client
127.0.0.1:2380: initial-cluster
kubelet组件说明:
port:
4194: cadvisor-port #cadvisor作为kubernetes一个组件集成在kubelet里
127.0.0.1:10248: localhost healthz endpoint #
10250: Kubelet to server on listen for HTTP and respond to a simple API (underspec’d currently) to submit a new manifest.
10255: The read-only port for the Kubelet to serve on with no authentication/authorization
# 只读暴露kubelet里的指标 http://192.168.199.142:10255/stats/summary
kube-proxy组件:
port:
127.0.0.1:10249: metrics server to serve on # metrics server 并未安装待探索
10256: health check server port
代理的其他服务端口
apiserver 组件说明:
port:
127.0.0.1:8080: insecure-port
6443: secure-port
API 认证策略(Authentication strategies):
X509 Client Certs、Service Account Tokens # https://kubernetes.io/docs/admin/authentication/
API 授权模式(Authorization Mozules):
Node、RBAC # https://kubernetes.io/docs/admin/authorization/
kube-controller-manager组件说明:
port:
10252: the controller-manager's http service runs on
kube-scheduler组件说明:
port:
10251: the scheduler's http service runs on
kube-dns组件说明:
k8s-dns-sidecar: # daemon that exports metrics and performs healthcheck on DNS systems.
10054: metrics
dnsmasq: # 集群内部默认的dns服务
53 tcp/udp
kube-dns: # 与apiserver交互
10053 tcp/udp #监听来自dnsmasq的 forward请求
备注:
如果reslov.conf 里面是127.0.1.1,本地启动的dnsmasq,在容器里会出现解析外网有问题。
https://github.com/kubernetes/kubernetes/issues/31337 如果你是这种情况 给你的kubelet添加启动参数 –resolv-conf自定义你的resolv.conf文件或者 DISABLE DNSMASQ的方式完成。 https://docs.docker.com/engine/installation/linux/linux-postinstall/#specify-dns-servers-for-docker 这个文章 可以详细看看
组件清单:
组件介绍官方文档:https://kubernetes.io/docs/concepts/overview/components/
kubernetes核心组件:
二进制: 版本
kubectl :kubernetes 客户端工具
kubelet Kubernetes v1.8.3
kube-proxy Kubernetes v1.8.3
容器方式: 镜像
etcd gcr.io/google_containers/etcd-amd64:3.0.17
kube-apiserver gcr.io/google_containers/kube-apiserver-amd64:v1.8.3
kube-controller-manager gcr.io/google_containers/kube-controller-manager-amd64:v1.8.3
kube-scheduler gcr.io/google_containers/kube-scheduler- amd64:v1.8.3
kubernetes-addons: addons 手动部署,自动的好像要加label没搞明白
容器方式: 镜像
kube-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
kube-dns-autoscaler gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.0.0
kube-dashboard gcr.io/google_containers/kubernetes-dashboard-init-amd64:v1.0.1
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.7.1
heapster gcr.io/google_containers/heapster-amd64:v1.4.0
calico quay.io/calico/node:v2.6.2
quay.io/calico/kube-controllers:v1.0.0
quay.io/calico/cni:v1.11.0
pause gcr.io/google_containers/pause-amd64:3.0
打包结构如下:
kubernetes_install:
/binary # 包含所需组件的二进制文件和docker镜像
/二进制\镜像如上列表
/save.sh #用于本地打包镜像
/docker_install
/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb
/install #docker 安装脚本
/conf 配置模板
/mainfests #kubelet manifests yaml
/etcd.yaml
/kubernetes-apiserver.yaml
/kubernetes-controller-manager.yaml
/kubernetes-scheduler.yaml
/kube-addon-manager.yaml s
/addons #kubernetes addons yaml
/kubernetes-dashboard.yaml
/dashboard-admin.yaml #dashboard的权限
/kubernetes-dns.yml
/heapster.yaml
/heapster-rbac.yaml
/dns-horizontal-autoscaler.yaml
/calico.yaml
/calico-rbac.yaml
/certs #存放生成的证书
/templates #cfss csr模板s
/apiserver-csr.conf.template
/ca-config.json #cfssl ca的config文件
/ca-csr.json #cfssl ca证书的csr文件
/kube-admin-csr.json.template
/kubelet-csr.json.template
/kube-proxy-csr.json
/scripts
/kubernetes_install.sh #节点执行的脚本
/node_var_template #节点变量模板
/INSTALL #安装主脚本
/cfssl_to_kubernetes.sh #证书生成脚本,被INSTALL调用
/cluster_var #定义集群参数
/README.md #说明
安装步骤:
1.准备环境:
1.1 安装docker:
建议docker版本:17.03.2-ce
环境确认:
net.ipv4.ip_forward = 1
iptables -P FORWARD ACCEPT 大小写敏感
docker 官方关于 ufw :forward 表 默认drop的说明:
https://docs.docker.com/engine/installation/linux/linux-postinstall/#allow-access-to-the-remote-api-through-a-firewall
kubernetes kube-proxy 关于这个问题的fix:
https://github.com/kubernetes/kubernetes/pull/52569
如果docker 安装有问题请参阅:https://docs.docker.com/engine/installation/linux/linux-postinstall/
1.2 环境准备:
关闭swap: swapoff -a
安装conntrack包: apt install conntrack
# kube-proxy的依赖,没有kube-proxy可能起不来
2.处理iptables:
删除docker创建的网桥:
systemctl stop docker
iptables -t nat -F
ip link set docker0 down
ip link delete docker0
使用calico 此处不需要删除docker建立的bridge。
新建 cbr0:
ip link add name cbr0 type bridge
ip link set dev cbr0 mtu 1460
ip addr add 10.0.0.1/16 dev cbr0 #此处IP为 pod range ip 的第一位
ip link set dev cbr0 up
iptables -t nat -A POSTROUTING ! -d 192.168.199.0/24 -m addrtype ! --dst-type LOCAL -j MASQUERADE
3.处理docker启动参数:
cp kubernetes_install/conf/systemd/docker.service /lib/systemd/system/docker.service
具体docker参数: --bridge=cbr0 --ip-masq=false --iptables=false --bridge=node --exec-root=/var/run/docker
LimitNOFILE=1048576
脚本处理时,dockerd的参数全部放置在了daemon.json
完整的 dockerd 配置手册 https://docs.docker.com/engine/reference/commandline/dockerd/
4.处理kubelet启动参数
cp kubernetes_install/conf/systemd/kubelet.service /lib/systemd/system/kubelet.service
具体kubelet参数: --allow-privileged --kubeconfig=/var/lib/kubelet/kubeconfig --pod-manifest-path=/etc/kubernetes/manifests --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --register-node --hostname-override=192.168.199.142 --node-ip 192.168.199.142 --network-plugin=cni
5.处理kube-proxy启动参数
cp kubernetes_install/conf/systemd/kube-proxy.service /lib/systemd/system/kube-proxy.service
具体kube-proxy参数: --proxy-mode=iptables --hostname-override=192.168.199.142 --master=https://192.168.199.142:6443 --kubeconfig=/var/lib/kube-proxy/kubeconfig --proxy-port-range=1-65535 --cluster-cidr=10.0.0.0/16
脚本内 --proxy-port-range=1-65535 没有打开 默认3000以上端口,看后期需求
修改参数3\4\5完毕之后执行systemctl daemon-reload
重启3\4\5中的服务
6.复制kubernetes-apiserver.yaml到宿主机/etc/kubernetes/manifests
cp kubernetes_install/conf/manifests/kubernetes-apiserver.yaml /etc/kubernetes/manifests/kubernetes-apiserver.yaml
apiserver的启动参数:
kube-apiserver
- --allow-privileged=true
- --address=192.168.199.142
- --service-cluster-ip-range=10.96.0.0/12
- --etcd-servers=http://127.0.0.1:2379
- --client-ca-file=/srv/kubernetes/ca.crt
- --tls-cert-file=/srv/kubernetes/apiserver.crt
- --tls-private-key-file=/srv/kubernetes/apiserver.key
- --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota
- --allow-privileged=true
- --insecure-bind-address=127.0.0.1
- --advertise-address=192.168.199.142
- --authorization-mode=Node,RBAC
- --service-node-port-range=0-65535
7.复制yaml配置文件
cp kubernetes_install/conf/manifests/kubernetes-controller-manager.yaml /etc/kubernetes/manifests/kubernetes-controller-manager.yaml
cp kubernetes_install/conf/manifests/kubernetes-scheduler.yaml /etc/kubernetes/manifests/kubernetes-scheduler.yaml
cp kubernetes_install/conf/addons/* /etc/kubernetes/addons/
8.证书生成:
脚本使用的cfssl,简单无脑
8.1 CA证书生成:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
# Distributing Self-Signed CA Certificate
sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates
8.2 apiserver证书生成:
openssl genrsa -out apiserver.key 2048
修改 kubernetes_install/cert/openssl/apiserver.csr.conf 文件分别将 <MASTER_IP> <MASTER_CLUSTER_IP>替换
openssl req -new -key apiserver.key -out apiserver.csr -config apiserver.csr.conf
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out apiserver.crt -days 10000 \
-extensions v3_ext -extfile apiserver.csr.conf
8.3 kubelet证书生成:
openssl genrsa -out kubelet.key 2048
openssl req -new -key kubelet.key -out kubelet-csr.pem -subj "/CN=system:node:${nodeip}/O=system:nodes"
# https://kubernetes.io/docs/admin/authorization/rbac/#default-roles-and-role-bindings
openssl x509 -req -in kubelet-csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet.crt -days 10000
8.4 kube-proxy证书生成:
openssl genrsa -out kube-proxy.key 2048
openssl req -new -key kubelet-proxy.key -out kube-proxy-csr.pem -subj "/CN=system:kube-proxy"
# https://kubernetes.io/docs/admin/authorization/rbac/#default-roles-and-role-bindings
openssl x509 -req -in kube-proxy-csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-proxy.crt -days 10000
8.4 kube-admin证书生成:
openssl genrsa -out kube-admin.key 2048
openssl req -new -key kube-admin.key -out kube-admin-csr.pem -subj "/CN=kube-admin/O=system:masters"
# https://kubernetes.io/docs/admin/authorization/rbac/#default-roles-and-role-bindings
openssl x509 -req -in kube-admin-csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-admin.crt -days 10000
将所有生成的crt key 复制到 /srv/kubernetes;should separate differnt crt/key
9 kubeconfig文件生成:
利用kubectl生成: should point generate config file
9.1 kubelet-kubeconfig 文件生成:
kubectl config set-cluster k8s --certificate-authority=/srv/kubernetes/ca.crt --embed-certs=true --server=https://192.168.199.142:6443
kubectl config set-credentials kubelet --client-certificate=/srv/kubernetes/kubelet.crt --client-key=/srv/kubernetes/kubelet.key --embed-certs=true
kubectl config set-context k8s_kubelet --cluster=k8s --user=kubelet
kubectl config use-context k8s_kubelet
mv /root/.kube/config /var/lib/kubelet/kubeconfig
9.2 kube-proxy-kubeconfig 文件生成:
kubectl config set-cluster k8s --certificate-authority=/srv/kubernetes/ca.crt --embed-certs=true --server=https://192.168.199.142:6443
kubectl config set-credentials system:kube-proxy --client-certificate=/srv/kubernetes/kube-proxy.crt --client-key=/srv/kubernetes/kube-proxy.key --embed-certs=true
kubectl config set-context k8s_kube-proxy --cluster=k8s --user=system:kube-proxy
kubectl config use-context k8s_kube-proxy
mv /root/.kube/config /var/lib/kube-proxy/kubeconfig
9.3 admin-kubeconfig 文件生成:
kubectl config set-cluster k8s --certificate-authority=/srv/kubernetes/ca.crt --embed-certs=true --server=https://192.168.199.142:6443
kubectl config set-credentials kube-admin --client-certificate=/srv/kubernetes/ kube-admin.crt --client-key=/srv/kubernetes/ kube-admin.key --embed-certs=true
kubectl config set-context k8s_kube-admin --cluster=k8s --user=kube-admin
kubectl config use-context kube-admin
备份你的admin-kubeconfig。