部署kubeadmin
实验思路
- 在所有节点上安装Docker和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署 Kubernetes Node,将节点加入Kubernetes集群中
- 部署 Dashboard Web 页面,可视化查看Kubernetes资源
- 部署 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
#让内核参数生效
所有节点安装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"
所有节点安装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
部署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
初始化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等证书和密码的目录
设定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
#重启
所有节点部署网络插件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
master节点查看状态
[root@master01 opt]# kubectl get nodes
[root@master01 opt]# kubectl get pods -n kube-system
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
#会看到暴露的端口
测试访问
curl http://:192.168.42.11:32112 就可以访问nginx网页;也可以将IP地址改为其他两台机器的,会发现都可以访问到nginx
扩展三个副本
[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输入里面,登录
安装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
安装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
[root@node01 opt]# docker login -u admin -p Harbor12345 https://hub.zly.com
如果显示报错,看一下harbor的服务,是否非正常关闭了,使用docker-commpose ps;如果关闭了,就重启一下docker-commpose restart
上传镜像
[root@node01 opt]# docker tag nginx:latest hub.zly.com/library/nginx:v1
[root@node01 opt]# docker push hub.zly.com/library/nginx:v1
在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
[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