K8s部署

K8s 通过kubeadm 方式进行部署

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

声明:本人采用虚拟机(VM)进行部署测试,并无没有在云服务器端搭建,其方式相同

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

服务器分部

hostnameIPdocker ver
master192.168.177.13020.10.1
worker 01192.168.177.13120.10.1
worker 02192.168.177.13220.10.1
k8s server
kubelet1.18.0
kubeadm1.18.0
kubectl1.18.0

这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
kubeadm init
# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口 >

Kubeadm方式搭建K8S集群

使用kubeadm方式搭建集群步骤如下

  • 准备三台虚拟机,同时安装操作系统CentOS 7.x
  • 对三个安装之后的操作系统进行初始化操作
  • 在三个节点安装 docker kubelet kubeadm kubectl
  • 在master节点执行kubeadm init命令初始化
  • 在node节点上执行 kubeadm join命令,把node节点添加到当前集群
  • 配置CNI网络插件,用于节点之间的连通【失败了可以多试几次】
  • 通过拉取一个nginx进行测试,能否进行外网测试

每台VM机器初始化

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  
# 临时关闭
setenforce 0  

# 关闭swap
# 临时
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8smaster
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8snode2

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.177.130 k8smaster
192.168.177.131 k8snode1
192.168.177.132 k8snode2
EOF

# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system  

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

安装Docker/kubeadm/kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker
跳转查看 http://zhangtianhao.cn/archives/docker-instll

添加kubernetes软件源

我们还需要配置一下yum的k8s软件源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet

部署Kubernetes Master【master节点】

在 192.168.150.128 执行,也就是master节点

kubeadm init   \
--apiserver-advertise-address=192.168.150.128   \
--image-repository registry.aliyuncs.com/google_containers   \
--kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12    \
--pod-network-cidr=10.244.0.0/16

# 注意:只要不和三个节点的IP 冲突即可
--service-cidr=10.96.0.0/12  
--pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像
docker images
install success

使用kubectl工具 【master节点操作】

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 nodes

kubectl get nodes

能够看到,目前有一个master节点已经运行了,但是还处于未准备状态
下面我们还需要在Node节点执行其它的命令,将node1和node2加入到我们的master节点上

添加K8s worker 节点

下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点
执行在kubeadm init输出的kubeadm join命令:

注意,master初始化完成后,每个人的sha256都不一样!
注意,master初始化完成后,每个人的sha256都不一样!
注意,master初始化完成后,每个人的sha256都不一样!

# 案例
kubeadm join 192.168.177.130:6443 --token 8j6ui9.gyr4i156u30y80xf \
    --discovery-token-ca-cert-hash sha256:eda1380256a62d8733f4bddf926f148e57cf9d1a3a58fb45dd6e80768af5a500

# 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command

# 当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况
kubectl get node

kubectl get node

安装网络组件(k8s-master执行)

网络组件:flannel、Canal、Calico、weave

# 安装Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 卸载Calico
# kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get pod --all-namespaces
kubectl get nodes

# 执行结果如下
[root@k8s-master ~]# kubectl get pod --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-8f59968d4-cl7n5   1/1     Running   4          9m40s
kube-system   calico-node-8xkjs                         0/1     Running   0          9m40s
kube-system   calico-node-h9vft                         0/1     Running   0          9m40s
kube-system   coredns-6d56c8448f-w9tp6                  1/1     Running   1          63m
kube-system   coredns-6d56c8448f-z6jnm                  1/1     Running   1          63m
kube-system   etcd-k8s-master                           1/1     Running   0          63m
kube-system   kube-apiserver-k8s-master                 1/1     Running   0          63m
kube-system   kube-controller-manager-k8s-master        1/1     Running   0          63m
kube-system   kube-proxy-7t644                          1/1     Running   0          63m
kube-system   kube-proxy-b845t                          1/1     Running   0          55m
kube-system   kube-scheduler-k8s-master                 1/1     Running   0          63m
[root@k8s-master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
chain1   Ready    master   63m   v1.19.2
chain2   Ready    <none>   55m   v1.19.2

注意: 若机器之前安装过k8s或rancher,请将对应网络组件清除。

# 例如:清理flannel网络插件残留
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
# 遇到问题:Calico官方默认配置下,有时会发现不了真实网卡接口,Calico相关容器报如下错误:
Readiness probe failed: caliconode is not ready: BIRD is not ready: BGP not established with x.x.x.x
# 解决办法:ifconfig查看CentOS真实网卡接口名,一般以ens或enp开头!,修改IP自动发现方法
ifconfig
vim calico.yaml


#搜索“k8s,bgp”,追加如下内容:
        - name: IP_AUTODETECTION_METHOD
          value: "interface=enp.*"   # ens 根据实际网卡开头配置
          
#截取修改后的部分内容如下:
		- name: CLUSTER_TYPE
          value: 'k8s,bgp'
        - name: IP_AUTODETECTION_METHOD
          value: "interface=enp.*"          
        - name: IP
          value: autodetect
        - name: CALICO_IPV4POOL_IPIP
          value: Always



kubectl apply -f calico.yaml
kubectl get pod --all-namespaces

安装kubernetes-dashboard

下载yaml文件并修改

wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
vim recommended.yaml
# 内容如下(截取修改部分):

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: 30443
  selector:
    k8s-app: kubernetes-dashboard

创建并启动服务

kubectl create -f recommended.yaml
kubectl get svc -n kubernetes-dashboard

# web访问:
https://192.168.1.220:30443/

获取默认token

kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard  | grep token | awk 'NR==3{print $2}'

eyJhbGciOiJSUzI1NiIsImtpZCI6ImZzLUJ3TS1LdGx1S0FCR3VWd1Z2SmlXSUlyalNzWlBITHo2WVlSQTl4Y0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtdG9rZW4tcG1sMm0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZWZkMmZmNmItODg5NC00NGZmLThiNDctODg1Yjc0MDMzODk5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZCJ9.BysUZfx9yHr4JT0oAIdarjndZLf2f9vjBlz9nyNtWoTUUYk_D-MbYfjFonWy5s1ZyIAfhFUB3Q89bXVbBA7L57eSO-K-zFwxiZPKOpJrmIC73FQYNWgkCWSAEC-0wn4-Z602wGll1EkL0AHLu8ntg8QoKH_ERS3rsouOvfaEXCc59QwwTet8gc2Kucx2YDdeP4wUOY5o67IoiNlHPglzxE-N98ifTircnbhJuvrIzX2ZuCKTkNtBIrnUQBriwBswcJjQPzwFBnHikeC7UcwB8JqqgbZ9koGOaNe8ywPTM3MFehr5RbLtKanGuaRFcG1KBU6FjalS4iYqNLlFawXh-A

在Web登录页面输入即可!右上角“小铃铛”会提示权限不足!
原因: 官方给的默认权限是最小的,所以我们要自建一个最大权限的SA

# 查看日志
kubectl get pods --all-namespaces
kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-5bc6d86cfd-7n99b

创建SA权限token

  • 方法1:编辑yaml文件,apply使之生效
vim dashboard.yaml
# 内容如下
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard
  namespace: kubernetes-dashboard
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dashboard
subjects:
  - kind: ServiceAccount
    name: dashboard
    namespace: kubernetes-dashboard
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

kubectl create -f dashboard.yaml
kubectl describe secrets -n kubernetes-dashboard dashboard  | grep token | awk 'NR==3{print $2}'

eyJhbGciOiJSUzI1NiIsImtpZCI6ImZzLUJ3TS1LdGx1S0FCR3VWd1Z2SmlXSUlyalNzWlBITHo2WVlSQTl4Y0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtdG9rZW4tcG1sMm0iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZWZkMmZmNmItODg5NC00NGZmLThiNDctODg1Yjc0MDMzODk5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZCJ9.BysUZfx9yHr4JT0oAIdarjndZLf2f9vjBlz9nyNtWoTUUYk_D-MbYfjFonWy5s1ZyIAfhFUB3Q89bXVbBA7L57eSO-K-zFwxiZPKOpJrmIC73FQYNWgkCWSAEC-0wn4-Z602wGll1EkL0AHLu8ntg8QoKH_ERS3rsouOvfaEXCc59QwwTet8gc2Kucx2YDdeP4wUOY5o67IoiNlHPglzxE-N98ifTircnbhJuvrIzX2ZuCKTkNtBIrnUQBriwBswcJjQPzwFBnHikeC7UcwB8JqqgbZ9koGOaNe8ywPTM3MFehr5RbLtKanGuaRFcG1KBU6FjalS4iYqNLlFawXh-A

  • 方法2:通过kubectl create命令
kubectl create serviceaccount k8s-sa -n kubernetes-dashboard
kubectl create clusterrolebinding k8s-sa-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:k8s-sa
kubectl describe secrets -n kubernetes-dashboard dashboard  | grep token | awk 'NR==3{print $2}'

# 使用新Token登录即可!

根据token创建登录config文件

secret=$(kubectl describe secrets -n kubernetes-dashboard k8s-sa  | grep token | awk 'NR==3{print $2}')
echo $secret
kubectl config set-cluster kubernetes --server=192.168.1.220:6443 --kubeconfig=./k8s-sa.conf
kubectl config set-credentials k8s-sa --token="$secret" --kubeconfig=./k8s-sa.conf
kubectl config set-context k8s-sa@kubernetes --cluster=kubernetes --user=k8s-sa --kubeconfig=./k8s-sa.conf
kubectl config use-context k8s-sa@kubernetes  --kubeconfig=./k8s-sa.conf
kubectl config view --kubeconfig=./k8s-sa.conf

# 使用config文件登录即可!
参考文献

Centos7环境用kubeadm搭建多节点k8s集群
kubernetes-dashboard安装
Kubernetes-dashboard安装、配置令牌和kubeconfig登录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值