系统相关
首页 > 系统相关> > Linux部署K8S(亲测有效)

Linux部署K8S(亲测有效)

作者:互联网

环境搭建说明

1:安装Linux版本为:CentOS-7-x86_64-DVD

 Linux版本:CentOS-7-x86_64-DVD-1908.iso

 

2:Linux安装教程,请参考以下地址:

https://blog.csdn.net/qq_38129621/article/details/105866574

 

3:架构图:

1:机器准备

这里我们准备三台虚拟机,一台master,二台node

机器角色

IP

主机名

Master

10.66.103.98

K8sMaster

Node1

10.66.104.153

K8sNode1

Node2

10.66.103.174

K8sNode2

 

2:安装前的环境确认

所有机器都需要执行:

a:三台机器都可以联网,uname -a查看内核是否大于等于3.1

b:关闭三台机器的防火墙

systemctl stop firewalld

systemctl disable firewalld

c:关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config

d:关闭swap

swapoff -a

vi /etc/fstab

注释这一行:/mnt/swap swap swap defaults 0 0

free -m查看swap是否全为0

e:配置三台机器的主机名,分别在三台机器上执行命令

10.66.103.98上执行:hostnamectl set-hostname k8smaster

10.66.103.153上执行:hostnamectl set-hostname k8snode1

10.66.103.174上执行:hostnamectl set-hostname k8snode2

f:在master的机器上添加hosts,在10.100.0.131上执行命令

cat >> /etc/hosts << EOF

10.66.103.98 k8smaster

10.66.103.153 k8snode1

10.66.103.174 k8snode2

EOF

g:将桥接的IPV4流量传递到iptables的链,三台机器都执行命令

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

h:所有节点执行命令,生效

sysctl --system

i:同步每个服务器的时间和时区

若遇到yum被占用时请执行:rm -f /var/run/yum.pid(强制停止yum进程)

yum install ntpdate -y ntpdate time.windows.com cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3:三台机器全部安装docker

所有机器都需安装

3.1:配置阿里云的镜像

 

3.2:刷新yum源

yum clean all

yum makecache

yum -y update

3.3:安装docker

yum -y install docker-ce-18.06.1.ce-3.el7

如果之前机器上有安装过,先删除,执行

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

3.4:启动docker,并设为开机自启动

systemctl enable docker && systemctl start docker

 

4:配置kubeadm,kubelet,kubectl镜像

所有机器都需要:

kubelet:运行在集群所有节点上,负责启动POD和容器

kubeadm:用于初始化集群

kubectl:kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

4.1:创建yum源的文件

cat > kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=0

gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF

4.2:将文件移到yum的目录

mv kubernetes.repo /etc/yum.repos.d/

 

5:安装kubeadm,kubelet,kubectl

所有机器都需要:

yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0

systemctl enable kubelet

 

6:初始化kubeadm(只在master机器上)

只执行master机器10.66.103.98:

 

 

 

 

7:将k8s生成的管理员连接k8s集群的配置文件考到它默认的工作目录

只执行master机器10.100.0.131:

这样就可以通过kubectl连接k8s集群了,执行命令:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

测试:

kubectl get node

 

8:安装pod网络插件CNI

只执行master机器10.100.0.131:

 

 

 

装好之后执行

kubectl get pods -n kube-system

所有组件状态都为:Running

9:将节点加入集群中

9.1:执行命令(在master机器上)

kubeadm token list #查看现在有的token

kubeadm token create #生成一个新的token

kubeadm token create --ttl 0 #生成一个永远不过期的token

 

9.2:获取ca证书sha256编码hash值(在master机器上运行)

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

 

9.3:加入节点(在要加入的机器上)

kubeadm join master机器Ip:6443 --token 9.1步查到没过期的token --discovery-token-ca-cert-hash sha256:9.2中获取的字符串

例:

kubeadm join 10.66.103.98:6443 --token uawh0f.urbo8j5ssadnansx --discovery-token-ca-cert-hash sha256:532bf485924a4438aa81322db515d5fb5b8f738852abf8ad2b62d588f85afdcc

如果node节点已经增加了对master的绑定可根据:kubeadm reset -f 解除绑定再进行绑定。

 

9.4:在master机器上执行命令,查看现在的节点情况

kubectl get nodes

 

可以看到,刚才加入的二个节点状态是NotReady,是因为它的网络还没有准备好,过几分钟再看,就会变成Read状态

 

10:部署K8s的管理页面Dashboard

10.1:在master中执行下列命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

 

10.2:

默认Dashboard只能集群内部访问,需要修改service为nodePort类型,暴露到外部,执行命令将配置文件下载下来

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

 

10.3:修改这个文件

vi recommended.yaml

找到这段,增加红包部分,冒号后面有一个空格,千万要注意

spec:

type: NodePort

ports:

- port: 443

targetPort: 8443

nodePort: 30001

selector:

k8s-app: kubernetes-dashboard

10.4:重新加载运行配置文件

kubectl apply -f recommended.yaml

 

11:访问k8s管理页面

https://master机器ip:30001

注意:这里必须是https的方式,如果谷哥浏览器不能访问,谷哥有的版本没有添加信任的地方,无法访问,可使用firefox或者其它浏览器。

 

12:访问不了k8s管理页面时,访问UI页面

#新建目录:

mkdir key && cd key

 

#生成证书

openssl genrsa -out dashboard.key 2048

 

#我这里写的自己的node1节点,因为我是通过nodeport访问的;如果通过apiserver访问,可以写成自己的master节点ip

openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.247.62.213'

openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

 

#删除原有的证书secret

kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

 

#创建新的证书secret

kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

 

#查看pod

kubectl get pod -n kubernetes-dashboard

 

#重启pod

kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  -n kubernetes-dashboard

 

获取UI登录 Token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

 

13:解决kubernetes-dashboard可视化问题(可参考以下网站)

 

 其实进入刚才可视化一堆提示的画面,所有功能都实现了,为什么集群信息没有显示呢,是因为权限不够,简单说就是登录token字符串命令,并没有查看集群信息的权限,我们要做的是创建一个可以访问集群全部权限的token,或者说某个用户是超级管理员使用这个用户的token.

 

token令牌认证登录

 

(1)创建serviceaccount

[root@kubernetes01 pki]# kubectl create serviceaccount dashboard-admin -n kube-system

serviceaccount/dashboard-admin created

 

[root@kubernetes01 pki]# kubectl get sa -n kube-system

NAME                                 SECRETS   AGE

。。。。。。

dashboard-admin                          1         17s

。。。。。。

 

(2)把serviceaccount绑定在clusteradmin,授权serviceaccount用户具有整个集群的访问管理权限

 

[root@kubernetes01 pki]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

clusterrolebinding.rbac.authorization.k8s.io/dashboard-cluster-admin created

 

(3)获取serviceaccount的secret信息,可得到token(令牌)的信息

[root@kubernetes01 pki]# kubectl get secret -n kube-system|grep dash

 

注意使用新创建token:dashboard-admin-token-kk862

[root@kubernetes01 pki]# kubectl describe secret dashboard-admin-token-kk862 -n kube-system

(4)通过patch暴露端口

 

[root@kubernetes01 pki]# kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system

service/kubernetes-dashboard patched (no change)

 

[root@kubernetes01 pki]# kubectl get svc -n kube-system

(5)浏览器访问登录,把token粘贴进去登录即可

 

2 kubeconfig配置文件登录

创建一个只能对default名称空间有权限的serviceaccount

 

[root@kubernetes01 pki]#  kubectl create serviceaccount def-ns-admin -n default

[root@kubernetes01 pki]#  kubectl create rolebinding def-ns-admin --clusterrole=admin --serviceaccount=default:def-ns-admin

rolebinding.rbac.authorization.k8s.io/def-ns-admin created

[root@kubernetes01 pki]#  kubectl get secret

[root@master1 pki]# kubectl describe secret def-ns-admin-token-xdvx5

 

 

 

  常用命令

查看那些端口开放

netstat -ntlp

 

启动防火墙

systemctl start firewalld

 

开放指定端口

firewall-cmd --zone=public --add-port=30001/tcp --permanent

 

查看防火墙状态

systemctl status firewalld.service

 

查看指定端口

netstat -ntulp |grep 30001

 

防火墙重新加载(开启之后重新加载)

firewall-cmd --reload

 

有哪些端口开放

firewall-cmd --zone=public --list-ports

 

安装telnet工具

yum -y install telnet.x86_64

 

删除node节点连接

kubeadm reset -f

 

查看dashboard的pod和服务状态

kubectl get po,svc -n kubernetes-dashboard

 

查看创建成功,查看所有po

# kubectl get po --all-namespaces

 

查看现有的所有服务

# kubectl get svc --all-namespaces

 

删除现有的dashboard服务

# kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard

 

# kubectl delete service dashboard-metrics-scraper --namespace=kubernetes-dashboard

 

删除现有的dashboard pod

# kubectl delete deployment kubernetes-dashboard --namespace=kubernetes-dashboard

 

# kubectl delete deployment dashboard-metrics-scraper --namespace=kubernetes-dashboard

 

查看dashboard pod的状态

kubectl get po -n kubernetes-dashboard

 

 

openssl req -days 3650 -new -out dashboard.csr -key dashboard.key -subj '/CN=10.66.103.98'

 

 

访问UI页面

#新建目录:

mkdir key && cd key

 

#生成证书

openssl genrsa -out dashboard.key 2048

 

#我这里写的自己的node1节点,因为我是通过nodeport访问的;如果通过apiserver访问,可以写成自己的master节点ip

openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.247.62.213'

openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

 

#删除原有的证书secret

kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

 

#创建新的证书secret

kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

 

#查看pod

kubectl get pod -n kubernetes-dashboard

 

#重启pod

kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  -n kubernetes-dashboard

 

获取UI登录 Token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

 

标签:kubectl,kubernetes,--,admin,token,dashboard,Linux,K8S,亲测
来源: https://www.cnblogs.com/baibin-520/p/16534825.html