kubeadmin

131 阅读3分钟

部署kubeadmin

实验思路

  1. 在所有节点上安装Docker和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器网络插件
  4. 部署 Kubernetes Node,将节点加入Kubernetes集群中
  5. 部署 Dashboard Web 页面,可视化查看Kubernetes资源
  6. 部署 Harbor 私有仓库,存放镜像资源

实验环境

节点
master(2C/4G)192.168.42.11
node01(2C/4G)192.168.42.17
node02(2C/4G)192.168.42.18
harbor(1C/4G)192.168.42.12

所有节点操作(harbor节点除外)

以master01为例(忘记改名字了)

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@localhost ~]# iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
[root@localhost ~]# swapoff -a
#关闭交换分区
[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
[root@localhost ~]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
##加载 ip_vs 模块
[root@localhost ~]# hostnamectl set-hostname master01
#修改主机名
[root@localhost ~]# vim /etc/hosts
#所有节点修改hosts文件
192.168.42.11 master01
192.168.42.17 node01
192.168.42.18 node02

[root@localhost ~]# cat > /etc/sysctl.d/kubernetes.conf << EOF
#调整内核参数
> net.bridge.bridge-nf-call-ip6tables=1
> net.bridge.bridge-nf-call-iptables=1
#开启网桥模式,可将网桥的流量传递给iptables链
> net.ipv6.conf.all.disable_ipv6=1
> net.ipv4.ip_forward=1
#关闭ipv6协议
> EOF

[root@localhost ~]# sysctl --system
#让内核参数生效

image.png

image.png

所有节点安装docker(harbor节点除外)

以master01为例(忘记改名字了)

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io

[root@localhost etc]# mkdir /etc/docker
[root@localhost docker]# cat > /etc/docker/daemon.json <<EOF
> {
>   "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
>   "exec-opts": ["native.cgroupdriver=systemd"],
>   "log-driver": "json-file",
>   "log-opts": {
>     "max-size": "100m"
>   }
> }
> EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker.service
[root@localhost docker]# systemctl enable docker.service

[root@localhost docker]# docker info | grep "Cgroup Driver"

image.png

image.png

所有节点安装kubeadm,kubelet和kubectl(harbor节点除外)

定义kubernetes源

[root@localhost docker]# 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

[root@localhost docker]# yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

[root@localhost docker]# systemctl enable kubelet.service
#开启自启kubelet

image.png

image.png

部署k8s集群(harbor除外)

[root@master01 docker]# kubeadm config images list
#查看初始化需要的镜像
#master节点上传v1.20.11.zip到/opt目录
[root@master01 opt]# unzip v1.20.11.zip -d /opt/k8s
#指定目录去解压
[root@master01 opt]# cd /opt/k8s/v1.20.11/
[root@master01 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done

[root@master01 v1.20.11]# scp -r /opt/k8s root@192.168.42.17:/opt/
[root@master01 v1.20.11]# scp -r /opt/k8s/ root@192.168.42.18:/opt/
#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
在进入node1和node2里面进入k8s目录,在运行for i in $(ls *.tar); do docker load -i $i; done

image.png

image.png

初始化kubeadm

[root@master01 v1.20.11]# kubeadm config print init-defaults > /opt/kubeadm-config.yaml
[root@master01 v1.20.11]# vim kubeadm-config.yaml
···············
12   advertiseAddress: 192.168.42.11
#修改为masterip
···············
 35 networking:
 36   dnsDomain: cluster.local
 37   podSubnet: "10.244.0.0/16"
 38   serviceSubnet: 10.96.0.0/12
 39 scheduler: {}
 #添加一些内容
 40 ---
 41 apiVersion: kubeproxy.config.k8s.io/v1alpha1
 42 kind: KubeProxyConfiguration
 43 mode: ipvs

[root@master01 opt]# kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志
将运行得出的结果,也就是最后几行复制到node01和node02上运行
kubeadm join 192.168.42.11:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:6519d27fd06eb4368955f31c39662bccba04e2f50c5260741e83de86d2b455b6

[root@master01 opt]# less kubeadm-init.log
#查看kubeadm-init 日志
[root@master01 opt]# ls /etc/kubernetes/
#kubernetes配置文件目录
[root@master01 opt]# ls /etc/kubernetes/pki/
#存放ca等证书和密码的目录

3274a85aa4171b6610c6d08e5d8be04.png

5ae38512007e49e51f4b53707758f07.png

设定kubectl

kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

root@master01 opt]# mkdir -p $HOME/.kube
[root@master01 opt]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 opt]# chown $(id -u):$(id -g) $HOME/.kube/config

如果 kubectl get cs 发现集群不健康,更改以下两个文件
[root@master01 opt]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
16     - --bind-address=192.168.42.11
24       httpGet:
25         host: 192.168.42.11
38       httpGet:
39         host: 192.168.42.11

[root@master01 opt]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
17     - --bind-address=192.168.42.11
36       httpGet:
37         host: 192.168.42.11
50       httpGet:
51         host: 192.168.42.11

[root@master01 opt]# systemctl restart kubelet
#重启

8d27fa10f2feb78b364c20e3246bae4.png

d0cd3c7286875c1772d7db82511a8fe.png

image.png

b04e319613a6b6a86fb86dec2220a85.png

所有节点部署网络插件flannel(harbor节点除外)

方法一

所有节点上传flannel镜像flannel.tar到/opt目录,master节点上传kube-flannel.yml文件
cd /opt
[root@master01 opt]# docker load < flannel.tar

在master节点创建flannel资源
[root@master01 opt]# kubectl apply -f kube-flannel.yml

kube-flannel.yml使用二进制里面的文件,将原本的/opt/cni、bin里面的所有都删除掉,
拉取cni-plugins-linux-amd64-v0.8.6.tgz,解压到/opt/cni/bin/里面
在运行二进制里面拉取的kube-flannel.yml

b5927d336e4c1a96d953101664cfff2.png

0b4dbb807391a3ef614f2c384f707b4.png

master节点查看状态

[root@master01 opt]# kubectl get nodes
[root@master01 opt]# kubectl get pods -n kube-system

fc4138ff7986d883fc3e11e5dd89d6d.png

3b6419d6d6c624e729c1a913ea0ddb1.png

master测试pod资源创建

[root@master01 opt]# kubectl create deployment nginx --image=nginx
#创建nginx的pod资源

暴露端口提供服务

[root@master01 opt]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@master01 opt]# kubectl get svc
#会看到暴露的端口

1b4fe0c8ac11b890abfc9a6350c2c01.png

测试访问

curl http://:192.168.42.11:32112 就可以访问nginx网页;也可以将IP地址改为其他两台机器的,会发现都可以访问到nginx

bf74e4bfc89ae0bff544c6af03468fd.png

扩展三个副本

[root@master01 opt]# kubectl scale deployment nginx --replicas=3
[root@master01 opt]# kubectl get pods -o wide

部署Dashboard

master01节点

将recommended.yaml文件上传到/opt/k8s目录中
[root@master01 opt]# cd /opt/k8s/
[root@master01 k8s]# vim recommended.yaml
················
32 kind: NodePort
················

[root@master01 k8s]# kubectl create serviceaccount dashboard-admin -n kube-system
#创建service account并绑定默认cluster-admin管理员集群角色
[root@master01 k8s]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
[root@master01 k8s]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

会显示token钥匙:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ikl2WGZoMG50WUFpWlVkbXFiZ2xxdDlZeDZ5VklEbExwMHN6d3RNdDNvNHcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4ta3J3OXAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNWJmNTE2NDYtZDVlNC00ZTM2LWEzODEtMTI0MjNjYWQ2NDg3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.k6o-oPhr6rvU8Ocse1hg_2MRZn-i7cY2wGiWKCeLBkyDMC4_uqaa4Ukn3-nDJeY3rLQKBUX59YznAoZudvxyhhBZVfEqPsmaK7XdmUeUzuVvtd07BdXm2GSkf1LEANtCBRx9E1QhFRX0IiAahHO3YyXci_P23kpOyz9UpEy5c7dmAjNT0PGuAjRHsJlQBUy2rj6Wl0M4ByzVvqhOot3-SJjpGyCDIImCYaAcJB-C7TK1WEPlF-XOu4nGniq3QJ2FVF6Ab0vv3pXBErPHnsFtzOpzwGpqZWh4_ssRnFN1tIjUf1378pZzuYHheMkYKkuvtcpJ7Ykign16fvCnIfLTlg

#打开master虚拟机,使用虚拟机里面的火狐浏览器
搜索:https://192.168.42.17:30000
将token输入里面,登录

21569686fa82a1564acf29b8598eb3d.png

9fc4755d03107b758def5fe2b3276e1.png

a0cbeec1097b05e9d7b0749621271d3.png

9ecc8e3cbc453ebddf76809995588a3.png

45a9dc59c5a10524756fb1f7670b3e8.png

bbc676e86059e50fce6c789e7c1b89c.png

安装Harbor私有仓库

harbor机子

[root@harbor opt]# hostnamectl set-hostname hub.zly.com
#修改主机名
[root@hub opt]# echo '192.168.42.12 hub.zly.com' >> /etc/hosts
#所有节点加上主机名映射

安装docker
[root@hub ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@hub ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@hub ~]# yum install -y docker-ce docker-ce-cli containerd.io

[root@hub ~]# mkdir /etc/docker
#所有node节点都修改docker配置文件,加上私有仓库配置
[root@hub docker]# cat > /etc/docker/daemon.json <<EOF
> {
>   "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
>   "exec-opts": ["native.cgroupdriver=systemd"],
>   "log-driver": "json-file",
>   "log-opts": {
>     "max-size": "100m"
>   },
>   "insecure-registries": ["https://hub.zly.com"]
> }
> EOF
[root@hub docker]# systemctl daemon-reload
[root@hub docker]# systemctl restart docker

60c9262f492315a3815e49a9292191b.png

60c9262f492315a3815e49a9292191b.png

安装Harbor

上传 harbor-offline-installer-v1.2.2.tgz和docker-compose文件到/opt目录
[root@hub docker]# cd /opt/
[root@hub opt]# ls
containerd  docker-compose  harbor-offline-installer-v1.2.2.tgz  rh
[root@hub opt]# cp docker-compose /usr/local/bin/
[root@hub opt]# chmod +x /usr/local/bin/docker-compose
[root@hub opt]# tar zxvf harbor-offline-installer-v1.2.2.tgz

[root@hub opt]# cd harbor/
[root@hub harbor]# vim harbor.cfg
············
5 hostname = hub.zly.com
············
9 ui_url_protocol = https
············
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
············
59 harbor_admin_password = Harbor12345

生成证书
[root@hub harbor]# mkdir -p /data/cert
生产私钥
[root@hub harbor]# cd /data/cert
[root@hub cert]# openssl genrsa -des3 -out server.key 2048
设置密码,输入两变密码:123456

生成证书签名请求文件
[root@hub cert]# openssl req -new -key server.key -out server.csr
输入私钥密码:123456
输入国家名:CN
输入省名:BJ
输入市名:BJ
输入组织名:ZLY
输入机构名:ZLY
输入域名:hub.zly.com
输入管理员邮箱:admin@zly.com
其它全部直接回车

[root@hub cert]# cp server.key server.key.org
#备份私钥
[root@hub cert]# openssl rsa -in server.key.org -out server.key
输入:123456
#清除私钥密码
[root@hub cert]# openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
#签名证书
[root@hub cert]# chmod +x /data/cert/*
[root@hub cert]# cd /opt/harbor/
[root@hub harbor]# ./install.sh

进去本机虚拟机使用火狐浏览器访问:hub.zli.com

点击“高级”;选择“添加例外”;点击“确认安全例外”

使用:

  • 用户名:admin
  • 密码:Harbor12345

在一个node节点上登录harbor

d2c392164a440ed05b8f42964b38965.png

f36605392cf84ebbf77cb0f8d3b771e.png

a68cc5869d844619e1f98bf307e801d.png

a7dffe2f256dbf9c22de5faa6a90d9c.png

706458d7bd4aaf43b6c70ac27482d6f.png

706458d7bd4aaf43b6c70ac27482d6f.png

0fef6d12f78bfea26cbe42aa39cd4d0.png

ab81aeeeed7c5073d4b581cea7a5108.png

0e08a4a85c97f1ac87004123d26e317.png

944d59c16e377b59d529f94c4d2f4a4.png

50fcb017d992d1f3e541bdb14069423.png

05ca92d9abe2d2d5efe47fbc43b4d9e.png

0a5d57af6cfec36c85044d30f679798.png

[root@node01 opt]# docker login -u admin -p Harbor12345 https://hub.zly.com

如果显示报错,看一下harbor的服务,是否非正常关闭了,使用docker-commpose ps;如果关闭了,就重启一下docker-commpose restart

f1cd9d6a259bdd6dcfa63611708e149.png

888c5baf19f6871def9e8fed9ae2b5a.png

上传镜像

[root@node01 opt]# docker tag nginx:latest hub.zly.com/library/nginx:v1
[root@node01 opt]# docker push hub.zly.com/library/nginx:v1

6709c424b73869991122861efa4ea42.png

在master节点上删除之前创建的nginx资源

[root@master01 k8s]# kubectl delete deployment nginx
[root@master01 k8s]# kubectl create deployment nginx-deployment --image=hub.zly.com/library/nginx:v1 --port=80 --replicas=3
#从hub.zly.com的仓库里面拉取nginx镜像
[root@master01 k8s]# kubectl expose deployment nginx-deployment --port=30000 --target-port=80
#暴露端口
[root@master01 k8s]# kubectl get svc,pods

eb0cf0e83f8923e7113991588756e5e.png

[root@master01 k8s]# yum install ipvsadm -y
[root@master01 k8s]# ipvsadm -Ln
#查看当前ipvs模块中记录的连接
[root@master01 k8s]# kubectl get svc
#访问nginx-deployment服务
[root@master01 k8s]# curl 10.111.47.128:30000

[root@master01 k8s]# kubectl edit svc nginx-deployment
·········
26   type: NodePort
·········
 
[root@master01 k8s]# kubectl get svc

浏览器访问:
192.168.42.11:31078
192.168.42.17:31078
192.168.42.18:31078

#将cluster-admin角色权限授予用户system:anonymous
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

f04a76b2fd03d721345b172ec323fc1.png

7c43a3a58200b8f5ccf27e9f02e6f7f.png

c63b213892db61bad45fb0e9fcd3078.png

d864823ff77c8b22de3dfc3ef27d491.png