k8s容器
k8s容器
一、什么是k8s,k8s有什么功能?
k8s是一个docker集群的管理工具
是一个开源的linux容器自动化平台 消除了容器化应用程序在部署、伸缩时涉及到的许多手动操作。你可以将多台主机组合成集群来运行linux容器,而k8s可以帮你简单高效的管理哪些集群。
1.k8s的核心功能
1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
2.弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
3.服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
4.滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
2.k8s的历史
2014年 #docker容器编排工具,立项
2015年7月 #发布kubernetes 1.0, 加入cncf
2016年 #kubernetes干掉两个对手,docker swarm,mesos 1.2版
2017年
2018年 #k8s 首个从cncf基金会毕业的项目
2019年 # 1.13, 1.14, 1.15
# cncf cloud native compute foundation 云原生计算基金会
# kubernetes (k8s): 希腊语 舵手,领航 容器编排领域,
# 谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes
3. k8s的安装
# yum安装 1.5 最容易安装成功,最适合学习的 (centos7用的就是1.5)
# 源码编译安装---难度最大 可以安装最新版
# 二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack(一键自动化安装)
# 谷歌推出 kubeadm 安装最容易, 但是网络不太好突破 可以安装最新版 1.16.(版本已经稳定了 生产环境可以用)
# minikube 适合开发人员体验k8s, 网络不太好突破
4.k8s的应用场景
k8s最适合跑微服务项目
开发mvc架构:早期
缺点:
1.都跑在一个服务器上面,一个挂了,全部挂 。某个功能访问量过大还会影响其他功能。
2.共用一个数据库,反正就是扛不住。
3.java修改代码,编译时间超长。
微服务:软件架构,拆业务
优点:
1.所有的功能都有自己的数据库,扛得住访问压力。
2.一个挂了其他的不会挂,健壮性更好。
3.代码复杂度降低,容易上手。
4.代码编译时间少。
k8s应用
二、k8s的架构
1.k8s架构
从逻辑架构来看,k8s分为三个点
POD
Controller
Service
从系统架来看,k8s分为2个节点
Master 控制节点 指挥官
Node 工作节点 干活的
Master节点组成
#API Server :提供k8s API接口
(api接口是个抽象的东西 就好比用户找api-server 要说api-server听得懂的话 相当于命令)
主要处理Rest操作以及更新Etcd中的对象
是所有资源增删改查的唯一入口。
#Scheduler:资源调度器
根据etcd里的节点资源状态决定将Pod绑定到哪个Node上
#Controller Manager
负责保障pod的健康存在
资源对象的自动化控制中心,Kubernetes集群有很多控制器。
#Etcd
这个是Kubernetes集群的数据库
所有持久化的状态信息存储在Etcd中
Node节点的组成
#Docker Engine
负责节点容器的管理工作,最终创建出来的是一个Docker容器。
#kubelet
安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。
#kube-proxy
安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
首先创建一个pod资源,是通过操作api-server来创建的。
api-server控制Controller Manager 和Scheduler组件。
通过控制Scheduler来调度我们节点上的资源,按照预定的调度策略将资源调度到相应的机器上。
Controller Manager 负责维护集群的状态,故障检测,自动伸缩,滚动更新,提供高可用服务。
etcd相当于一个数据库,节点上资源都在存在里面。
kubelet通过调用docker启动容器。
flannel网络插件,跨宿主机容器通信。
除了核心组件,还有一些推荐的Add-ons:
组件名称 | 说明 |
---|---|
kube-dns | 负责为整个集群提供DNS服务 |
Ingress Controller | 为服务提供外网入口 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
默认四层负载均衡 监控主要是监控弹性收缩
ELK:elasticsearch Logstach Kibana
EFK:elasticsearch Fluentd Kibana
三、k8s的yum安装
1.修改IP地址、主机和host解析
# 所有节点需要做hosts解析
10.0.0.5 k8s-master
10.0.0.6 k8s-node-1
10.0.0.7 k8s-node-2
[root@k8s-master ~]# cat /etc/hosts
10.0.0.5 k8s-master
10.0.0.6 k8s-node-1
10.0.0.7 k8s-node-2
[root@k8s-master ~]# scp /etc/hosts 10.0.0.6:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts 10.0.0.7:/etc/hosts
2.master节点安装etcd
# 1.下载etcd数据库
[root@k8s-master ~]# yum install etcd -y
# 2.修改配置文件
[root@k8s-master ~]# vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
21行:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.5:2379"
# 3.开机自启
[root@k8s-master ~]# systemctl start etcd.service
[root@k8s-master ~]# systemctl enable etcd.service
# 4.测试写值读值
[root@k8s-master ~]# etcdctl set /test 100
100
[root@k8s-master ~]# etcdctl get /test
100
[root@k8s-master ~]# etcdctl mk /linux/test1 99
99
[root@k8s-master ~]# etcdctl ls /
/test
/linux
# 5.检查健康状况
[root@k8s-master ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.5:2379
cluster is healthy
etcd原生支持做集群
3.master节点安装kubernetes
# 1.下载包[包里包含3个服务]
[root@k8s-master ~]# yum install kubernetes-master.x86_64 -y
# 2.修改配置文件
[root@k8s-master ~]# vim /etc/kubernetes/apiserver [api-server的配置文件]
8行: KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
11行:KUBE_API_PORT="--port=8080"
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.5:2379"
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
[root@k8s-master ~]# vim /etc/kubernetes/config [Controller Manager和scheduler的配置文件]
22行:KUBE_MASTER="--master=http://10.0.0.5:8080"
# 3.启动服务 [必须按顺序启动]
[root@k8s-master ~]# systemctl enable kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-apiserver.service
[root@k8s-master ~]# systemctl enable kube-controller-manager.service
[root@k8s-master ~]# systemctl restart kube-controller-manager.service
[root@k8s-master ~]# systemctl enable kube-scheduler.service
[root@k8s-master ~]# systemctl restart kube-scheduler.service
# 4.检查状况
依赖docker 必须先启动docker
[root@k8s-master ~]# kubectl get componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
4.node节点安装kubernetes
# 1.下载包 自带docker源
[root@k8s-node-1 ~]# yum install kubernetes-node.x86_64 -y
# 2.修改配置文件
[root@k8s-node-1 ~]# vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://10.0.0.5:8080"
[root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0"
8行:KUBELET_PORT="--port=10250"
11行:KUBELET_HOSTNAME="--hostname-override=10.0.0.6"
14行:KUBELET_API_SERVER="--api-servers=http://10.0.0.5:8080"
# 3.启动服务
[root@k8s-node-1 ~]# systemctl enable kubelet.service [会把docker拉起来]
[root@k8s-node-1 ~]# systemctl start kubelet.service
[root@k8s-node-1 ~]# systemctl enable kube-proxy.service
[root@k8s-node-1 ~]# systemctl start kube-proxy.service
# 4.另一台节点
[root@k8s-node-2 ~]# scp -rp 10.0.0.6:/etc/kubernetes/kubelet /etc/kubernetes/kubelet
[root@k8s-node-2 ~]# vim /etc/kubernetes/kubelet
11行:KUBELET_HOSTNAME="--hostname-override=10.0.0.7"
[root@k8s-node-2 ~]# vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://10.0.0.5:8080"
# 5.检查节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.6 Ready 11m
10.0.0.7 Ready 13s
5.所有节点配置flannel网络
k8s中,pod和pod可以互通,但是需要flannel网络
# 1.下载flannel网络插件
[root@k8s-master ~]# yum install flannel -y
[root@k8s-node-1 ~]# yum install flannel -y
[root@k8s-node-2 ~]# yum install flannel -y
# 2.修改配置文件
[root@k8s-master ~]# sed -i 's#http://127.0.0.1:2379#http://10.0.0.5:2379#g' /etc/sysconfig/flanneld
[root@k8s-node-1 ~]# sed -i 's#http://127.0.0.1:2379#http://10.0.0.5:2379#g' /etc/sysconfig/flanneld
[root@k8s-node-2 ~]# sed -i 's#http://127.0.0.1:2379#http://10.0.0.5:2379#g' /etc/sysconfig/flanneld
# 3.master节点执行
##创建一个需要的目录 网卡防止冲突我给了这么一个网段
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.21.0.0/16"}'
##下载docker
[root@k8s-master ~]# yum install docker -y
##启动flanne网络插件
[root@k8s-master ~]# systemctl enable flanneld.service
[root@k8s-master ~]# systemctl restart flanneld.service
##启动docker
[root@k8s-master ~]# service docker restart
##重启之前的服务 【按顺序】
[root@k8s-master ~]# systemctl restart kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-controller-manager.service
[root@k8s-master ~]# systemctl restart kube-scheduler.service
# 4.node节点执行
##启动flanne网络插件
[root@k8s-node-1 ~]# systemctl enable flanneld.service
[root@k8s-node-1 ~]# systemctl restart flanneld.service
##启动docker
[root@k8s-node-1 ~]# service docker restart
##重启之前的服务 【按顺序】
[root@k8s-node-1 ~]# systemctl restart kubelet.service
[root@k8s-node-1 ~]# systemctl restart kube-proxy.service
# 5.查看ip 【在所有会话窗口执行命令】
docker load -i docker_busybox.tar.gz
docker run -it busybox:latest
/ # ifconfig
k8s-master: eth0-172.21.52.2
k8s-node-1: eth0-172.21.78.1
k8s-node-2: eth0-172.21.83.2
# docker-1.13版,调了iptables规则,所以ping自己通,ping其他主机不通
ping 172.21.52.2
64 bytes from 172.21.52.2: seq=0 ttl=64 time=0.082 ms
64 bytes from 172.21.52.2: seq=1 ttl=64 time=0.048 ms
/ # ping 172.21.78.1
100% packet loss
/ # ping 172.21.83.2
100% packet loss
# 临时解决方式: [重启失效]
[root@k8s-master ~]# iptables -P FORWARD ACCEPT
[root@k8s-node-1 ~]# iptables -P FORWARD ACCEPT
[root@k8s-node-2 ~]# iptables -P FORWARD ACCEPT
/ # ping 172.21.78.1
64 bytes from 172.21.78.1: seq=0 ttl=60 time=1.480 ms
64 bytes from 172.21.78.1: seq=1 ttl=60 time=0.445 ms
/ # ping 172.21.83.2
64 bytes from 172.21.83.2: seq=0 ttl=60 time=1.511 ms
64 bytes from 172.21.83.2: seq=1 ttl=60 time=0.499 ms
# 永久解决方式: [全部节点]
##查看docker systemd配置路径
systemctl status docker
/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
在ExecStart上面加
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
##重启测试
/ # ping 172.21.78.1
64 bytes from 172.21.78.1: seq=0 ttl=60 time=1.215 ms
64 bytes from 172.21.78.1: seq=1 ttl=60 time=0.466 ms
/ # ping 172.21.83.2
64 bytes from 172.21.83.2: seq=0 ttl=60 time=1.270 ms
64 bytes from 172.21.83.2: seq=1 ttl=60 time=0.441 ms
6.配置master为镜像仓库
# 1.低版本docker 全部节点改这个配置文件
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=10.0.0.5:5000'
# 2.全部节点重启docker
systemctl restart docker
# 3.master节点建立私有仓库
##上传registry镜像包
[root@k8s-master ~]# ll
-rw-r--r-- 1 root root 35771392 Aug 15 09:35 registry.tar.gz
[root@k8s-master ~]# docker load -i registry.tar.gz
##启动私有仓库
[root@k8s-master ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
# 4.测试私有仓库
##查看镜像
[root@k8s-node-2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6d5fcfe5ff17 7 days ago 1.22 MB
##镜像打标签
[root@k8s-node-2 ~]# docker tag busybox:latest 10.0.0.5:5000/busybox:latset
##上传镜像至仓库
[root@k8s-node-2 ~]# docker push 10.0.0.5:5000/busybox:latset
##查看私有仓库有没有镜像
[root@k8s-master ~]# ls /opt/myregistry/docker/registry/v2/repositories/
busybox
四、k8s的kubeadm安装
1.环境准备
#初始化操作
干净环境
#配置主机名
node1
node2
node3
#配置host解析
10.0.0.11 node1
10.0.0.12 node2
10.0.0.13 node3
#关闭防火墙
systemctl disabled firewalld
#关闭SELinux
grep "disabled" /etc/selinux/config
#配置时间同步
[root@node1 ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
#更新好阿里源 (资料包里有修改好的源)
CentOS-Base.repo
epel.repo
#确保网络通畅
ping node1
ping node2
ping node3
#关闭SWAP分区
swapoff -a (临时关闭)
vim /etc/fstab (配置文件删掉swap)
2.安装指定版本docker
版本要对应,不然k8s不支持
三个节点都装
# 1.设置国内YUM源
cd /etc/yum.repos.d/
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2.安装指定的docker版本
yum -y install docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7
# 3.设置docker使用阿里云加速
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 4.启动后台进程
systemctl enable docker && systemctl start docker
# 5.查看docker版本
docker -v
3.部署kubeadm和kubelet
相当于k8s部署k8s
所有节点都操作
# 1.设置k8s国内yum仓库
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 2.安装kubeadm和ipvs
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
# 3.设置k8s禁止使用swap
cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
# 4.设置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
# 5.设置kubelet开机启动
systemctl enable kubelet && systemctl start kubelet
# 6.加载IPVS模块
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv
4.初始化集群部署MASTER
# 0.安装规划
节点规划:
node1 master节点 API Server controlle scheduler kube-proxy etcd
node2
node3
IP规划:
POD IP. 10.2.0.0
Cluster IP. 10.1.0.0
Node IP. 10.0.0.0
只在node1上
# 1.初始化命令
[root@node1 ~]# kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
# 2.根据上一步安装成功之后的提示操作 为kubectl准备kubeconfig
[root@node1 ~]# mkdir -p $HOME/.kube
[root@node1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 3.获取node节点信息
[root@node1 ~]# kubectl get nodes
[root@node1 ~]# kubectl get pod -n kube-system
[root@node1 ~]# kubectl get pod -n kube-system -o wide
# 4.支持命令补全
[root@node1 ~]# yum install bash-completion -y
[root@node1 ~]# source /usr/share/bash-completion/bash_completion
[root@node1 ~]# source <(kubectl completion bash)
[root@node1 ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
# 5.查看资源 注意资源等下重启会删掉一个
[root@node1 ~]# kubectl get -n kube-system pod
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-fzcbq 0/1 Pending 0 24m
coredns-58cc8c89f4-sqvpz 0/1 Pending 0 24m
etcd-node1 1/1 Running 0 23m
kube-apiserver-node1 1/1 Running 0 23m
kube-controller-manager-node1 1/1 Running 0 24m
kube-proxy-pbbdf 1/1 Running 0 24m
kube-scheduler-node1 1/1 Running 0 24m
# 6.设置kube-proxy使用ipvs模式
#执行下面命令找到mode模块修改为ipvs
#保存弹出`configmap/kube-proxy edited`表示成功修改
[root@node1 ~]# kubectl edit cm kube-proxy -n kube-system
mode: "ipvs"
# 7.重启kube-proxy 这个过程就是删掉一个,重新启动个新的
[root@node1 ~]# kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
# 8.重启后查看pod信息 注意上面对比 多了一个z2pwg
[root@node1 ~]# kubectl get -n kube-system pod
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-fzcbq 0/1 Pending 0 32m
coredns-58cc8c89f4-sqvpz 0/1 Pending 0 32m
etcd-node1 1/1 Running 0 31m
kube-apiserver-node1 1/1 Running 0 31m
kube-controller-manager-node1 1/1 Running 0 32m
kube-proxy-z2pwg 1/1 Running 0 5s
kube-scheduler-node1 1/1 Running 0 32m
# 9.检查日志,如果出现IPVS rr就表示成功 这个可以自动补全,后面的kube-proxy-z2pwg是可变的
[root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-z2pwg
IPVS
# 10.检查IPVS规则
[root@node1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr
-> 10.0.0.11:6443 Masq 1 0 0
TCP 10.1.0.10:53 rr
TCP 10.1.0.10:9153 rr
UDP 10.1.0.10:53 rr
5.部署网络插件flannel
# 1.部署Flannel网络插件
[root@node1 ~]# git clone --depth 1 https://github.com/coreos/flannel.git
# 可以直接下载zip包解压 放root就行
[root@node1 ~]# unzip flannel-master.zip
# 解压出相应目录
flannel-master
# 2.修改资源配置清单
[root@node1 ~]# cd flannel-master/Documentation/
[root@node1 ~]# vim kube-flannel.yml
128: "Network": "10.2.0.0/16",
172: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
186: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
192: - --iface=eth0 (这行是新增加一行 不是把原来的192内容删掉)
[root@node1 ~]# egrep -n "10.2.0.0|mirror|eth0" kube-flannel.yml
128: "Network": "10.2.0.0/16",
172: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
186: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
192: - --iface=eth0
# 3.应用资源配置清单
[root@node1 ~]# kubectl create -f kube-flannel.yml
# 4.检查pod运行状态,等一会应该全是running
[root@node1 ~]# kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-fzcbq 1/1 Running 0 63m
coredns-58cc8c89f4-sqvpz 1/1 Running 0 63m
etcd-node1 1/1 Running 0 63m
kube-apiserver-node1 1/1 Running 0 63m
kube-controller-manager-node1 1/1 Running 0 63m
kube-flannel-ds-amd64-ztz98 1/1 Running 0 3m17s
kube-proxy-z2pwg 1/1 Running 0 31m
kube-scheduler-node1 1/1 Running 0 63m
6.部署Node节点
# 1.在master节点上输出增加节点的命令
[root@node1 ~]# kubeadm token create --print-join-command
kubeadm join 10.0.0.11:6443 --token xqt7at.mgavhsyb1bfv6j2m --discovery-token-ca-cert-hash sha256:0a65e65bf4094b2bf4038a0fe4908dc6b97fe1d76a9c009e95065af24ab7251b
# 2.在node2和node3节点执行加入集群的命令 每个人的token不一样
[root@node2 ~]# kubeadm join 10.0.0.11:6443 --token xqt7at.mgavhsyb1bfv6j2m --discovery-token-ca-cert-hash sha256:0a65e65bf4094b2bf4038a0fe4908dc6b97fe1d76a9c009e95065af24ab7251b
[root@node3 ~]# kubeadm join 10.0.0.11:6443 --token xqt7at.mgavhsyb1bfv6j2m --discovery-token-ca-cert-hash sha256:0a65e65bf4094b2bf4038a0fe4908dc6b97fe1d76a9c009e95065af24ab7251b
# 3.在node1节点上查看状态
等一等会变ready
[root@node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
node1 Ready master 130m v1.16.2
node2 Ready <none> 4m23s v1.16.2
node3 Ready <none> 8m36s v1.16.2
# 4.给节点打标签
[root@node1 ~]# kubectl label nodes node2 node-role.kubernetes.io/node=
[root@node1 ~]# kubectl label nodes node3 node-role.kubernetes.io/node=
# 5.再次查看节点状态
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 151m v1.16.2
node2 Ready node 25m v1.16.2
node3 Ready node 29m v1.16.2
至此kubeadm就结束了他的使命,站在一旁观察。
7.配置harbor作为k8s镜像仓库
报错总结:
1.如果要删除的镜像正在被容器使用,那么你是删不了的
2.harbor卸载不干净,/data/harbor/目录下的数据也要删除
3.secret配置只写了一个dp,实际上有几个deployment就需要写几个
重做k8s使用harbor作为私有仓库:
# 1.停止harbor正在运行的容器
# 2.删除harbor的容器
docker ps -a|grep "goharbor"|awk '{print "docker rm "$1}'
# 3.删除harbor的镜像
dockerimages|grep "goharbor"|awk '{print "docker rmi "$1":"$2}'
# 1.在node1上安装harbor
[root@node1 /opt]# ll
-rw-r--r-- 1 root root 634959522 Feb 25 09:05 harbor-offline-installer-v1.9.3.tgz
[root@node1 /opt]# tar zxf harbor-offline-installer-v1.9.3.tgz
[root@node1 /opt]# cd harbor/
# 2.在node1上安装harbor
[root@node1 /opt/harbor]# vim harbor.yml
hostname: 10.0.0.11
port: 8888
harbor_admin_password: 123456
data_volume: /data/harbor
# 3.执行安装
[root@node1 /opt/harbor]# yum install docker-compose -y
[root@node1 /opt/harbor]# ./install.sh
出现报错:[Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"
拖个key上去
[root@node1 /opt/harbor]# cd /etc/pki/rpm-gpg
rz:RPM-GPG-KEY-EPEL-7
# 4.浏览器访问
http://10.0.0.11:8888
admin
123456
# 5.建立镜像仓库
这里有2种访问级别:
公开:任何人都可以直接访问并下载镜像
私有:登陆授权后才允许下载镜像
如果创建私有仓库,k8s是不能直接下载的,需要配置安全文件
# 6.所有节点都配置docker信任harbor仓库并重启docker
cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries" : ["http://10.0.0.11:8888"]
}
EOF
systemctl restart docker
###############注意!!!!!!!!!!!!!!!!!!###############
在node1上重启docker后,如果harbor不正常了,重启harbor即可
[root@node1 ~]# cd /opt/harbor
[root@node1 /opt/harbor]# docker-compose stop
[root@node1 /opt/harbor]# docker-compose start
# 7.docker登陆harbor
[root@node1 /opt/harbor]# docker login 10.0.0.11:8888
admin
123456
# 8.将docker登陆凭证转化为k8s能识别的base64编码
[root@node1 ~]# cat /root/.docker/config.json|base64
ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTE6ODg4OCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZN
VEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tl
ci1DbGllbnQvMTguMDkuOSAobGludXgpIgoJfQp9
10.编写Secert资源配置清单
[root@node1 ~/demo]# cat harbor-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: harbor-secret
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjAuMTE6ODg4OCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZNVEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuOSAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson
# 10.应用Secret资源
kubectl delete -f harbor-secret.yaml
kubectl create -f harbor-secret.yaml
kubectl get secrets
# 11.修改镜像tag并上传到harbor
docker tag kubeguide/tomcat-app:v1 10.0.0.11:8888/k8s/tomcat-app:v1
docker tag mysql:5.7 10.0.0.11:8888/k8s/mysql:5.7
docker push 10.0.0.11:8888/k8s/tomcat-app:v1
docker push 10.0.0.11:8888/k8s/mysql:5.7
# 12.修改demo资源配置清单
####mysql
imagePullSecrets:
- name: harbor-secret
###tomcat
imagePullSecrets:
- name: harbor-secret
# 13.应用资源清单并查看
kubectl apply -f .
kubectl get pod
# 14.浏览器查看
http://10.0.0.11:30001/demo