本次用两台虚机,配置如下
| ip | 节点名称 | 别名 |
|---|---|---|
| 192.168.3.112 | master | learn1 |
| 192.168.3.113 | node | learn2 |
-
Centos版本7.7.1908 linux内核版本5.4.2,k8s对centos版本和内核版本都有要求,所以安装前请仔细核对版本。
-
几个注意点:
一、master节点2c/2G内存最好,1G内存会出现莫名其妙的坑。所以配置内存稍微大点。
二、对于选择的K8s版本,一定要找到相应的Dashboard版本,否则你的Dashboard可能版本不兼容出现各种错误。Dashboard各版本的github地址 ,Dashboard对应的k8s版本已经列的很清楚了。
1、 k8s集群部署
一、 master和node节点都需要执行的步骤
- 关闭防火墙和senforece,hosts中添加服务器ip和别名映射
setenforce 0
service iptables stop
iptables防火墙禁用开机自启 systemctl disable iptables
vi /etc/hosts
192.168.3.112 learn1
192.168.3.113 learn2
- 添加路由转发策略
vi /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
生效策略 sysctl -p /etc/sysctl.d/k8s.conf
- 添加阿里云k8s的yum的源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF
- 开始安装
Docker的安装参见Docker安装。
- 安装控制工具 指定版本安装因为kbs是1.17.4
yum install -y kubelet-1.17.4 kubeadm-1.17.4 kubectl-1.17.4
- 关闭swap
注释掉/etc/fstab中的swap选项 建议生产和测试环境用此策略,本机性能差的话先忽略
#/dev/mapper/centos_learn1-swap swap defaults 0 0
- 以下步骤只需要在master节点执行
- 准备镜像 需要去阿里云镜像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
再修改为和谷歌名称一样的镜像
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4 k8s.gcr.io/kube-apiserver:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4 k8s.gcr.io/kube-controller-manager:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.4 k8s.gcr.io/kube-scheduler:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4 k8s.gcr.io/kube-proxy:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
- kubeadm init 启动一个 Kubernetes master 节点,本机加上了--ignore-preflight-errors=Swap,其他环境请忽略。
kubeadm init --kubernetes-version="v1.17.4" --pod-network-cidr="10.244.0.0/16" --ignore-preflight-errors=Swap
如果初始化失败,则通过kubeadm reset清理环境,再次执行即可。
出现的问题
- k8s注册节点提示Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd" 在damen中增进如下配置即可:
[root-learn1@/root]#vi /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]
重新加载启动docker
[root-learn1@/root]#systemctl daemon-reload
[root-learn1@/root]#systemctl restart docker
再次查看就没问题了
[root-learn1@/root]#docker info | grep Cgrou
Cgroup Driver: systemd
- 安装成功
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.3.112:6443 --token mmbw6k.pl97lh4kmk6tm532
--discovery-token-ca-cert-hash sha256:27ddddddddd8c4fasdfasdfa1fadasfasafasdfaaaed66ff01761214ff73c1d8
这里需要记录下kubeadm join的node节点加入集群命令,及其对应的加密串,否则忘记后需要你自己生成。
- 根据安装成功提示执行
[root-learn1@/root]#mkdir -p $HOME/.kube
[root-learn1@/root]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root-learn1@/root]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root-learn1@/root]#cat ~/.kube/config
这个是kubectl使用的默认配置文件,没有这个配置文件是无法连接k8s集群的
查看部署的pod运行情况
[root-learn1@/etc/kubernetes]#kubectl get pods -n kube-system
如果是Running就没问题,否则需要排查下
kubectl describe pod -n kube-system {pod的Name}
二、安装网络插件Flannel,只需master节点部署
- 拉取配置文件, 因为配置文件中有镜像因为网络原因quay.io访问不了,需要修改配置文件,所以采用拉取修改配置文件方式。
创建目录存放配置文件
mkdir -p k8s/flunnelconfig
cd k8s/flunnelconfig
拉取配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果连接的站点有问题则在etc/hosts中添加
151.101.76.133 raw.githubusercontent.com
替换镜像源
sed -i 's@quay.io@quay-mirror.qiniu.com@g' kube-flannel.yml
- 启动flannel
kubectl apply -f kube-flannel.yml
- 查看运行状态
[root-learn1@/root/k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
learn1 Ready master 94m v1.17.4
状态为Ready即可。
其他状态也顺便看下,也可以等node节点加入后再综合看下。
kubectl get pods -n kube-system -o wide |grep flannel
如果运行状态不是Running,需要排查下,同master初始化
kubectl describe pod -n kube-system {pod的Name}
三、node节点安装
通用部分参见一、 master和node节点都需要执行的步骤
- 镜像安装
只需要安装如下两个镜像即可 ,根据master的步骤执行即可,不再累述。
k8s.gcr.io/kube-proxy:v1.17.4
k8s.gcr.io/pause:3.1
- node加入Master集群 --ignore-preflight-errors=Swap 只在本机测试用,其他环境请忽略。
[root-learn2@/root]#kubeadm join 192.168.3.112:6443 --token mmbw6k.pl97lh4kmk6tm532 --ignore-preflight-errors=Swap --discovery-token-ca-cert-hash sha256:27d6f8c4e7eeeeeeeeee9eee22623b6e8aaed66ff01761222222ff73c1d8
- 查看节点加入状态
可以在maseter节点查看,如果想要在node节点执行kubectl get podes ,则需要把/root/.kube/config文件从master节点拷贝过来
[root-learn2@/root/.kube]#kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
[root-learn2@/root/.kube]#
[root-learn2@/root]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
learn1 Ready master 38h v1.17.4
learn2 Ready <none> 25h v1.17.4
到现在为止集群环境就搭建完成了,如果再加入多个node,可以复制node的安装步骤即可。 接下来看下K8s的WebUI界面Dashboard如何部署。
2、Dashboard部署
本次选择了在Master节点上安装,因为给Master节点分配的资源比node节点的充裕些。
版本选择在文章开头就说过了,很重要!!!!很重要!!!!很重要!!!!
安装步骤
- 删除旧的Dashboard,注意kubernetes-dashboard命名空间下不要放其他pods,否则删除就麻烦了。
kubectl delete ns kubernetes-dashboard
- 下载yaml文件,因为要修改其中的几个地方,根据文章开头的github地址的安装指引找到下载地址
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
- 修改配置文件的service通过NodePort方式访问K8S Dashboard,否则只能通过虚拟机本身来访问。
[root-learn1@/root/k8s/dashborads]#vi recommended.yaml
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #新加此行
ports:
- port: 443
targetPort: 8443
nodePort: 32100 #新加此行
添加如下两处
type: NodePort #新加此行
nodePort: 32100 #新加此行
- 启动Dashboard
[root-learn1@/root/k8s/dashborads]#kubectl apply -f recommended.yaml
[root-learn1@/root/k8s/dashborads]#kubectl get service -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.111.19.226 <none> 8000/TCP 3h27m
kubernetes-dashboard NodePort 10.96.178.193 <none> 443:32100/TCP 3h27m
由于指定了端口可以通过https://192.168.3.112:32100,注意是443端口,所以是https访问。问题就来了,firefox访问没问题,chrome有问题,都是因为证书失效的原因,网上也有几种获取证书的方法,不再累述,这里我们因为是自己的环境,所以采用手工生成证书的方式。
1、停掉pod
kubectl delete -f recommended.yaml
2、手动创建命名空间
kubectl create namespace kubernetes-dashboard
3、创建目录,自定义即可
cd 到自定义目录我这里是/root/k8s/dashborads/certs/
先生成证书
openssl genrsa -out dashboard.key 2048
192.168.3.112这个可以替换长自己的ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.3.112'
生成证书
openssl x509 -req -days 3650 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
删除原有证书
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
通过新生成的证书创建secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=/root/k8s/dashborads/certs/dashboard.key --from-file=/root/k8s/dashborads/certs/dashboard.crt -n kubernetes-dashboard
创建完成secret后需要修改recommended.yaml
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc7
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --tls-cert-file=dashboard.crt
- --tls-key-file=dashboard.key
- --token-ttl=3600
说明
增加如下参数
- --tls-cert-file=dashboard.crt
- --tls-key-file=dashboard.key
- --token-ttl=3600
不要注释 - --auto-generate-certificates这个参数不仅仅是自动证书的开关,还是总的HTTPS的开关,当我们手工配置了证书后,容器不会自动生成
- --tls-cert-file=dashboard.crt 名称对应/root/k8s/dashborads/certs/下的dashboard.crt 挂载后容器去/certs/下找你映射的这个文件名称
- --tls-key-file=dashboard.key 名称对应/root/k8s/dashborads/certs/下的dashboard.key 挂载后容器去/certs/下找你映射的这个文件名称
- --token-ttl=3600
重建pod
kubectl apply -f recommended.yaml
- 此时你用chrome登录后就弹出需要验证token了,如下:
recommended.yaml配置文件中的普通用户是无法登录的,所以需要我们新建一个有集群管理角色的用户来登录.新建一个yaml文件我这里为dashboard-adminuser.yaml,内容如下:
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
创建了一个admin-user,用户名字随便起,赋予ClusterRoleBinding角色权限,关联到clusert-admin(名称是固定的不能修改)。
创建账户
kubectl apply -f dashboard-adminuser.yaml
查看生成的token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
注意生成的token前面有一串空格,不同版本要求不一样,有的需要拷贝带空格,有的不需要,我这个版本不需要,所以直接拷贝内容即可。登录成功后如下
- 当出现匿名用户不能访问时,暂时先绑定下角色。
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
但是这不是最终解决方法,我后来把这个绑定角色又删除了,清理浏览器缓存后再用生成的token登录就好了。