本文简要描述了kubernetes 集群再centos 7 上的搭建。
1.准备: 三台centos 7 虚拟机, 配置相同2core 4G 内存。一台用于master, 两台node。
2.三台机器都需要安装 docker : Docker version 18.03.0-ce, build 0520e24
3.由于kubernetes会自身管理网络,磁盘,内存,IO 等,所以需要linux系统做出如下操作:(三台机器都需要操作)
3.1 关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld
3.2 关闭selinux:
$ sed -i ‘s/enforcing/disabled/’ /etc/selinux/config
$ setenforce 0
3.3 关闭swap:
$ swapoff -a
$ vim /etc/fstab (修改这个文件,把swap那行注释掉即可)
3.4 修改主机名:(不修改的话,k8s启动会有名称冲突,因为默认都是localhost.local)
$ hostnamectl set-hostname k8s-master (设置master机器的名称为k8s-master)
$ hostnamectl set-hostname k8s-node2 (设置一台node机器的名称为k8s-node2)
$ hostnamectl set-hostname k8s-node3 (设置另一台node机器的名称为k8s-node3)
3.5 分别配置三台机器的hosts:
$ vi /etc/hosts 添加如下内容
192.168.8.132 k8s-master (我的master局域网地址)
192.168.8.133 k8s-node2 (我的node2局域网地址)
192.168.8.134 k8s-node3 (我的node3局域网地址)
3.6 配置桥接到路由表里:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
- 安装k8s:由于k8s 源再国内无法访问,需要设置成阿里的源: 执行以下命令先设置源:
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
然后就可以运行下面命令安装k8s 核心组件:
$ yum install -y kubelet kubeadm kubectl
然后启动:
$ systemctl enable kubelet
- 至此, 三台机器的k8s基本安装完成。接下来要初始化和启动集群:
5.1 在master上执行下面命令: (ip是master 的本机ip,v1.18.2是k8s 的版本。我本机使用上面源安装的就是1.18.2。 pod-network-cidr=10.244.0.0/16 是k8s 的网络插件。 k8s支持很多种网络插件。 其中10.244.0.0/16 使用的是一个叫flannel 的插件。还有很多不同的插件,就需要配置不同的ip段。这里使用flannel即可。)
$ kubeadm init --apiserver-advertise-address=192.168.8.132 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.2 --pod-network-cidr=10.244.0.0/16
上面这条命令就是初始化了许多证书cert. 可以在/etc/kubernetes 下看到。
5.2 初始化证书后,可以配置环境变量:依次执行以下命令:
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
然后就可以用下面命令看到起来的node了。
$kubectl get nodes
5.3 接下来,由于上面初始化使用的10.244.0.0/16 (代表着flannel网络),所以需要把flannel 插件下载安装。 同样由于国内无法访问。 我找了个***把文件内容复制了下来。 然后再上传到master 的机器上新建flannel.yml 文件。 然后粘贴下面内容:
然后运行命令: $ kubectl apply -f flannel.yml
至此master 安装完成。
- master 节点已经启动,此时需要把node2,node3 接入进来。接入很简单,就是把master启动的那个命令复制一下。 在 node2 和node3 上执行即可:
$ kubeadm join 192.168.8.132:6443 --token beaueq.6p220xifr5chpzxr --discovery-token-ca-cert-hash sha256:25b801bd749cdfdb…7ac86b53a2af217c914deb482bdba5b66
- 回到master上执行:
$ kubectl get nodes
可以看到master 和两个node都是ready状态。
7.1 接下来可以安装官方提供的dashboard。我的k8s 是1.8.2 ,dashboard v2.0.0正好支持,所以下载下面这个即可。(同理自己找VPN下载,然后copy到服务器上。)
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml(我本地叫recommanded.yml)
7.2 master上新建一个admin-user-rolebinding…yml,用于配置更大的用户权限。
admin-user-rolebinding.yml内容如下。
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
最后同样 $ kubectl apply -f admin-user-rolebinding.yml
7.3 获取登录的token:
$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk ‘{print $1}’)
- 最后把dashboard 服务改成对外服务。(k8s默认启动cluster-ip类型,集群内部可以调用, 暴露成NodePort后,外部才能访问。$ kubectl get svc 可以看到暴露的端口号)
$ kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p ‘{“spec”:{“type”:“NodePort”}}’
- 如果可以访问的话那么用token方式登录, 粘贴上面的token即可。 但是实际用浏览器打开会报错。需要自己重新生成证书
9.1先 删除 kubectl delete -f recommanded.yml 。 删除后把recommanded.yml 进行修改。
编辑recommanded.yml 删除secret部分:
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: Opaque
修改service 资源,改为nodeport 类型:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 31779
selector:
k8s-app: kubernetes-dashboard
9.2创建证书:
$ mkdir /ssl && cd /ssl
$ openssl genrsa -out ca.key 2048
$ openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj “/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=CA”
$ openssl x509 -in ca.crt -noout -text
9.3签发证书:
$ openssl genrsa -out dashboard.key 2048
$ openssl req -new -sha256 -key dashboard.key -out dashboard.csr -subj “/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=192.168.8.132”
$ vi dashboard.cnf
extensions = san
[san]
keyUsage = digitalSignature
extendedKeyUsage = clientAuth,serverAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = IP:192.168.8.132,DNS:localhost
$ openssl x509 -req -sha256 -days 3650 -in dashboard.csr -out dashboard.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extfile dashboard.cnf
$ openssl x509 -in dashboard.crt -noout -text
9.4挂载证书到kubernetes-dashboard
重新部署
$ kubectl apply -f recommended.yml admin-user-rolebinding.yml
$ kubectl create secret generic kubernetes-dashboard-certs --from-file="./dashboard.crt,./dashboard.key" -n kubernetes-dashboard
9.5. 获取token
$kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard | grep admin-user | awk ‘{print $1}’)
-
重启kube-proxy
kubectl get pod -n kube-system | grep kube-proxy |awk ‘{system(“kubectl delete pod “$1” -n kube-system”)}’ -
kubernetes集群使用docker注册表类型的秘密对容器注册表进行身份验证,以获取私有映像。
如果您已经运行了Docker登录,则可以将该凭证复制到Kubernetes中:
kubectl create secret generic harborsecret \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson