内容简介:其它两个node节点,需要在kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper 角色,然后 kubelet 才有权限创建认证请求在
七、Kubernet 高可用集群搭建–Node节点
部署 Node 节点
其它两个node节点,需要在 两个节点 都执行安装操作
下载文件
# wget https://download.docker.com/linux/static/stable/x86_64/docker-17.12.0-ce.tgz # tar zxvf docker-17.12.0-ce.tgz # cp docker/docker* /usr/local/bin
配置启动docker
cat > docker.service << EOF [Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.io [Service] Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin" EnvironmentFile=-/run/flannel/subnet.env EnvironmentFile=-/run/flannel/docker ExecStart=/usr/local/bin/dockerd \\ --exec-opt native.cgroupdriver=cgroupfs \\ --log-level=error \\ --log-driver=json-file \\ --storage-driver=overlay \\ \$DOCKER_NETWORK_OPTIONS ExecReload=/bin/kill -s HUP \$MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF
$DOCKER_NETWORK_OPTIONS和$MAINPID不需要替换; flanneld 启动时将网络配置写入到 /run/flannel/docker 文件中的变量 DOCKER_NETWORK_OPTIONS,dockerd 命令行上指定该变量值来设置 docker 0 网桥参数; 如果指定了多个 EnvironmentFile 选项,则必须将 /run/flannel/docker 放在最后(确保 docker0 使用 flanneld 生成的 bip 参数); 不能关闭默认开启的 –iptables 和 –ip-masq 选项; 如果内核版本比较新,建议使用 overlay 存储驱动; –exec-opt native.cgroupdriver=systemd参数可以指定为”cgroupfs”或者“systemd”
启动 docker 服务
# cp docker.service /etc/systemd/system/docker.service systemctl daemon-reload systemctl enable docker systemctl start docker systemctl status docker
安装和配置 kubelet
kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper 角色,然后 kubelet 才有权限创建认证请求
下面这条命令只在master点执行一次即可
在 Master中 执行
[root@master1 ~]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap clusterrolebinding "kubelet-bootstrap" created
下载安装 kubelet 和 kube-proxy
# wget https://dl.k8s.io/v1.8.6/kubernetes-server-linux-amd64.tar.gz
# tar -xzvf kubernetes-server-linux-amd64.tar.gz
# cp -r kubernetes/server/bin/{kube-proxy,kubelet} /usr/local/bin/
创建kubelet 工作目录
sudo mkdir /var/lib/kubelet
配置启动kubelet
cat > kubelet.service << EOF [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 \ --address=0.0.0.0 \ --hostname-override=192.168.161.164 \ --pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest \ --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --require-kubeconfig \ --cert-dir=/etc/kubernetes/ssl \ --container-runtime=docker \ --cluster-dns=10.254.0.2 \ --cluster-domain=cluster.local \ --hairpin-mode promiscuous-bridge \ --allow-privileged=true \ --serialize-image-pulls=false \ --register-node=true \ --logtostderr=true \ --cgroup-driver=cgroupfs \ --v=2 Restart=on-failure KillMode=process LimitNOFILE=65536 RestartSec=5 [Install] WantedBy=multi-user.target EOF
详解:
–address 是本机ip,不能设置为 127.0.0.1,否则后续 Pods 访问 kubelet 的 API 接口时会失败,因为 Pods 访问的 127.0.0.1 指向自己而不是 kubelet; –hostname-override 也是本机IP; –cgroup-driver 配置成 cgroup(保持docker和kubelet中的cgroup driver配置一致即可); –experimental-bootstrap-kubeconfig 指向 bootstrap kubeconfig 文件,kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求; 管理员通过了 CSR 请求后,kubelet 自动在 –cert-dir 目录创建证书和私钥文件(kubelet-client.crt 和 kubelet-client.key),然后写入 –kubeconfig 文件(自动创建 –kubeconfig 指定的文件); 建议在 –kubeconfig 配置文件中指定 kube-apiserver 地址,如果未指定 –api-servers 选项,则必须指定 –require-kubeconfig 选项后才从配置文件中读取 kue-apiserver 的地址,否则 kubelet 启动后将找不到 kube-apiserver (日志中提示未找到 API Server),kubectl get nodes 不会返回对应的 Node 信息; –cluster-dns 指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),–cluster-domain 指定域名后缀,这两个参数同时指定后才会生效; –cluster-domain 指定 pod 启动时 /etc/resolve.conf 文件中的 search domain ,起初我们将其配置成了 cluster.local.,这样在解析 service 的 DNS 名称时是正常的,可是在解析 headless service 中的 FQDN pod name 的时候却错误,因此我们将其修改为 cluster.local,去掉嘴后面的 ”点号“ 就可以解决该问题; 重点: –kubeconfig=/etc/kubernetes/kubelet.kubeconfig中指定的kubelet.kubeconfig文件在第一次启动kubelet之前并不存在,请看下文,当通过CSR请求后会自动生成kubelet.kubeconfig文件,如果你的节点上已经生成了~/.kube/config文件,你可以将该文件拷贝到该路径下,并重命名为kubelet.kubeconfig,所有node节点可以共用同一个kubelet.kubeconfig文件,这样新添加的节点就不需要再创建CSR请求就能自动添加到kubernetes集群中。同样,在任意能够访问到kubernetes集群的主机上使用kubectl –kubeconfig命令操作集群时,只要使用~/.kube/config文件就可以通过权限认证,因为这里面已经有认证信息并认为你是admin用户,对集群拥有所有权限。
启动 kubelet
# cp kubelet.service /etc/systemd/system/kubelet.service systemctl daemon-reload systemctl enable kubelet systemctl start kubelet systemctl status kubelet
放行端口:
vim /etc/sysconfig/iptables 添加: -A INPUT -p tcp -m tcp --dport 10250 -j ACCEPT -A INPUT -p tcp -m tcp --dport 4194 -j ACCEPT systemctl restart iptables
执行TLS 证书授权请求
kubelet 首次启动时向 kube-apiserver 发送证书签名请求,必须授权通过后,Node才会加入到集群中 在三个节点都部署完kubelet之后,在 master节点 执行授权操作
#查询授权请求 [root@master1 src]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-NJOmhPckh1ijz4JfhrsTVjVviM_7FnwntHHUW6BS0S0 21s kubelet-bootstrap Pending node-csr-hYIK53ahSn2XqKMHj0z-8Rx7ihEY2AOTJ1UUsKKxn5A 27s kubelet-bootstrap Pending #授权: [root@master1 src]# kubectl certificate approve node-csr-NJOmhPckh1ijz4JfhrsTVjVviM_7FnwntHHUW6BS0S0 certificatesigningrequest "node-csr-NJOmhPckh1ijz4JfhrsTVjVviM_7FnwntHHUW6BS0S0" approved [root@master1 src]# kubectl certificate approve node-csr-hYIK53ahSn2XqKMHj0z-8Rx7ihEY2AOTJ1UUsKKxn5A certificatesigningrequest "node-csr-hYIK53ahSn2XqKMHj0z-8Rx7ihEY2AOTJ1UUsKKxn5A" approved #查看已加入集群的节点(什么鬼? 竟然没有?) [root@master1 src]# kubectl get nodes No resources found. ##再次查看下。。。(还是没有) [root@master1 src]# kubectl get nodes No resources found.
查原因呗。。。
当我再次仔细阅读了 如上这句话之后,然后奇迹出现了。。。(Ps:花了大量的时间去找解决方案。。)
–kubeconfig=/etc/kubernetes/kubelet.kubeconfig中指定的kubelet.kubeconfig文件在第一次启动kubelet之前并不存在,请看下文,当通过CSR请求后会自动生成kubelet.kubeconfig文件,如果你的节点上已经生成了~/.kube/config文件,你可以将该文件拷贝到该路径下,并重命名为kubelet.kubeconfig,所有node节点可以共用同一个kubelet.kubeconfig文件,这样新添加的节点就不需要再创建CSR请求就能自动添加到kubernetes集群中。同样,在任意能够访问到kubernetes集群的主机上使用kubectl –kubeconfig命令操作集群时,只要使用~/.kube/config文件就可以通过权限认证,因为这里面已经有认证信息并认为你是admin用户,对集群拥有所有权限。
操作:
[root@node1 src]# cp /root/.kube/config /etc/kubernetes/ [root@node1 src]# cd !$ cd /etc/kubernetes/ [root@node1 kubernetes]# ls bootstrap.kubeconfig config kube-proxy.kubeconfig ssl token.csv [root@node1 kubernetes]# mv config kubelet.kubeconfig [root@node1 kubernetes]# ls bootstrap.kubeconfig kubelet.kubeconfig kube-proxy.kubeconfig ssl token.csv [root@node1 kubernetes]# systemctl restart kubelet
再次在两台master上查看的时候:
Master1 [root@master1 src]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.161.164 Ready <none> 2m v1.8.6 192.168.161.165 Ready <none> 2m v1.8.6 #Master2 [root@master2 src]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.161.164 Ready <none> 2m v1.8.6 192.168.161.165 Ready <none> 2m v1.8.6
创建kube-proxy工作目录
在node节点执行
# mkdir -p /var/lib/kube-proxy
配置启动kube-proxy
cat > kube-proxy.service << EOF [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=192.168.161.164 \\ --hostname-override=192.168.161.164 \\ --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 EOF
详解:
–bind-address 参数为本机IP –hostname-override 参数为本机IP,值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则; –cluster-cidr 必须与 kube-apiserver 的 –service-cluster-ip-range 选项值一致,kube-proxy 根据 –cluster-cidr 判断集群内部和外部流量,指定 –cluster-cidr 或 –masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT; –kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息; 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;
启动 kube-proxy
# cp kube-proxy.service /etc/systemd/system/ systemctl daemon-reload systemctl enable kube-proxy systemctl start kube-proxy systemctl status kube-proxy
在另外的一个节点165上面进行部署操作, 注意替换其中的ip 。
八、Kubernet 高可用集群搭建–部署Web UI界面
安装DNS插件
在 Master节点 上进行安装操作
下载安装文件
# cd # wget https://github.com/kubernetes/kubernetes/releases/download/v1.8.6/kubernetes.tar.gz # tar xzvf kubernetes.tar.gz # cd /root/kubernetes/cluster/addons/dns # mv kubedns-svc.yaml.sed kubedns-svc.yaml #把文件中$DNS_SERVER_IP替换成10.254.0.2 # sed -i 's/$DNS_SERVER_IP/10.254.0.2/g' ./kubedns-svc.yaml # mv ./kubedns-controller.yaml.sed ./kubedns-controller.yaml #把$DNS_DOMAIN替换成cluster.local # sed -i 's/$DNS_DOMAIN/cluster.local/g' ./kubedns-controller.yaml # ls *.yaml kubedns-cm.yaml kubedns-controller.yaml kubedns-sa.yaml kubedns-svc.yaml [root@master1 dns]# kubectl create -f . configmap "kube-dns" created deployment "kube-dns" created serviceaccount "kube-dns" created service "kube-dns" created
替换如上google镜像源:
hub.c.163.com/zhijiansd/k8s-dns-kube-dns-amd64:1.14.5 hub.c.163.com/zhijiansd/k8s-dns-dnsmasq-nanny-amd64:1.14.5 hub.c.163.com/zhijiansd/k8s-dns-sidecar-amd64:1.14.5
部署 dashboard 插件
在 master节点 部署
新增部署配置文件
需要2个文件。
文件一
dashboard.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubernetes-dashboard
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard
namespace: kube-system
labels:
k8s-app: kubernetes-dashboard
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
serviceAccountName: kubernetes-dashboard
containers:
- name: kubernetes-dashboard
image: registry.docker-cn.com/kubernetesdashboarddev/kubernetes-dashboard-amd64:head
resources:
limits:
cpu: 100m
memory: 300Mi
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 9090
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
文件二:
dashboard-svc.yaml文件
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard
namespace: kube-system
labels:
k8s-app: kubernetes-dashboard
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
k8s-app: kubernetes-dashboard
type: NodePort
ports:
- port: 9090
targetPort: 9090
nodePort: 8888
给个吉利数字,因为这个端口来的太不容易了。。。
分别执行2个部署文件
kubectl create -f dashboard.yaml kubectl create -f dashboard-svc.yaml
如何访问?
[root@master1 ~]# kubectl get po -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE kube-dns-5bbc489b94-gmhhp 3/3 Running 0 33m 172.30.92.2 192.168.161.165 kubernetes-dashboard-8665cd4dfb-sfnch 1/1 Running 0 24m 172.30.43.3 192.168.161.164
首先查看一下部署的服务是否正常?
如上可以很清晰的看到 咱们部署的 kubernetes-dashboard 在 192.168.161.165 上面已经部署了。
那我们可以去访问下:
http://192.168.161.165:8888
部署 heapster 插件
下载安装文件
# wget https://github.com/kubernetes/heapster/archive/v1.5.0.tar.gz # tar xzvf ./v1.5.0.tar.gz # cd ./heapster-1.5.0/ [root@master1 heapster-1.5.0]# kubectl create -f deploy/kube-config/influxdb/ deployment "monitoring-grafana" created service "monitoring-grafana" created serviceaccount "heapster" created deployment "heapster" created service "heapster" created deployment "monitoring-influxdb" created service "monitoring-influxdb" created [root@master1 heapster-1.5.0]# kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml clusterrolebinding "heapster" created
登录dashboard
要是直接放在yaml文件中记得去掉 docker pull
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.8.1 docker pull registry.docker-cn.com/kubernetesdashboarddev/kubernetes-dashboard-amd64:head gcr.io/google_containers/heapster-grafana-amd64:v4.4.3 docker pull registry.cn-hangzhou.aliyuncs.com/inspur_research/heapster-grafana-amd64:v4.4.3 gcr.io/google_containers/heapster-amd64:v1.4.2 docker pull registry.cn-hangzhou.aliyuncs.com/inspur_research/heapster-amd64:v1.4.2 gcr.io/google_containers/heapster-influxdb-amd64:v1.3.3 docker pull registry.cn-hangzhou.aliyuncs.com/inspur_research/heapster-influxdb-amd64:v1.3.3
当然,还有广大的网友支持:(阿里镜像站)
https://dev.aliyun.com/search.html
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Elasticsearch 集群搭建和集群原理
- Zookeeper学习系列【二】Zookeeper 集群章节之集群搭建
- Spark集群环境搭建
- Zookeeper搭建集群
- FastDFS集群搭建
- Zookeeper集群环境搭建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!