003-k8s集群安装、配置私有化仓库、集群与仓库联合使用
一、概述
官方提供的三种Kubernetes部署方式:
minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。官方地址:https://kubernetes.io/docs/setup/minikube/
kubeadm Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包 从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
Harbor:仓库;
操作系统:centos7以上【docker采用了很多名称空间,在centos6中都是不支持的,所以采用centos7,内核≥4.4最好,否则有些docker出bug】,需要4台centos7
二、 集群部署
3.1、创建三台机器
10.0.0.79 k8s-master01 10.0.0.80 k8s-node01 10.0.0.81 k8s-node02
3.2、配置主机名称及host【每台机器执行】
#设置 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02 #查看 hostname #临时修改主机名:hostname 临时主机名 #永久修改主机名:hostnamectl 永久主机名 是对/etc/hostname文件的内容进行修改
host配置
大型项目搭建DNS,小型直接配置host
vi /etc/hosts 10.0.0.79 k8s-master01 10.0.0.80 k8s-node01 10.0.0.81 k8s-node02
host 拷贝【与上面每台执行,或者其中一个执行,其他拷贝】
scp /etc/hosts root@10.0.0.80:/etc/hosts
scp /etc/hosts root@10.0.0.81:/etc/hosts
3.3、安装依赖包【每台机器执行】
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
3.4、设置防火墙为 Iptables 并设置空规则【每台机器执行】
# 关闭7的防火墙 systemctl stop firewalld && systemctl disable firewalld # 安装新的iptables yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
3.5、关闭selinux【每台机器执行】
# 关闭swap,防止容器在虚拟内存运行 swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #关闭SELINUX setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
3.6、优化内核参数【每台机器执行】
#创建文件 cat > kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 #禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 #开启 OOM fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF
拷贝和使其生效
# 拷贝 cp kubernetes.conf /etc/sysctl.d/kubernetes.conf # 使其生效 sysctl -p /etc/sysctl.d/kubernetes.conf
如果文件不生效,升级4.4即可
3.7、调整系统时区【每台机器执行】
先查看一个:timedatectl,符合的话不用执行
# 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
同步日期:ntpdate time1.aliyun.com
关闭不需要的服务【每台机器执行】
systemctl stop postfix.service && systemctl disable postfix.service
3.8、设置 rsyslogd 和 systemd journald【每台机器执行】
# 持久化日志方式 mkdir /var/log/journal mkdir /etc/systemd/journald.conf.d
写入配置
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslog ForwardToSyslog=no EOF
重启服务
systemctl restart systemd-journald
3.9、升级系统内核为 4.44【每台机器执行】
# 内核查看 uname -r
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,升级如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 安装完成后检查 /boot/grub2/grub.cfg 中对应内核menuentry 中是否包含initd16配置,如果没有,再试一次 yum --enablerepo=elrepo-kernel install kernel-lt # 设置开机从新内核启动【注意内核号 是步安装的内核号】 grub2-set-default "CentOS Linux (4.4.232-1.el7.elrepo.x86_64) 7 (Core)"
查看内核即可:uname -r
3.10、kube-proxy开启ipvs的前置条件【每台机器执行】
#1、加载netfilter模块 modprobe br_netfilter #2、添加配置文件 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 #3、赋予权限并引导 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4
检测:lsmod | grep -e ipvs -e nf_conntrack_ipv4 或者 lsmod | grep ip_vs
3.11、安装docker【每台机器执行】
#1、docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 #2、导入阿里云的docker-ce仓库 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #3、更新系统安装docker-ce yum update -y yum install -y docker-ce #4、uname -r 检测版本,再设置版本,后又重启reboot grub2-set-default "CentOS Linux (4.4.232-1.el7.elrepo.x86_64) 7 (Core)" reboot #5、启动docker && 开机自启 systemctl start docker && systemctl enable docker #6、配置deamon cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" } } EOF #7、创建目录存放docker配置文件 mkdir -p /etc/systemd/system/docker.service.d #8、重启docker systemctl daemon-reload && systemctl restart docker && systemctl enable docker
3.12、安装Kubeadm(主从配置)【每台机器执行】
#1、导入阿里云的YUM仓库 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF #2、在每个节点安装kubeadm(初始化工具)、kubectl(命令行管理工具)、kubelet(与docker的cri交互创建容器) yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 # 3、k8s开机自启.kubelet需要与容器接口进行交互启动容器,而k8s通过Kubeadm安装出来以后都是以pod方式存在,也就是底层以容器的方式运行,所以一定要开机自启 systemctl enable kubelet.service
在线安装
部署master(意ip请更换成自己环境中的主节点ip)【仅在master执行】
kubeadm init --apiserver-advertise-address=10.0.0.79 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
效果:docker images
配置kubectl
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
查看
kubectl get node #NAME STATUS ROLES AGE VERSION #k8s-master01 NotReady master 27m v1.15.1
开启IPVS【master】
kubectl edit cm kube-proxy -n kube-system
# mode字段,默认为“”,修改为 ipvs
#删除所有的 标签为kube-proxy的 po实例,k8s会自动按新的配置安装新的kube-proxy
kubectl delete pod -l k8s-app=kube-proxy -n kube-system
3.13、网络部署
1》fannel部署
一般的网络无法访问quay.io,找国内的镜像源,或者从docker hub上拉取flannel的镜像,此处选择第2种方式。
手动拉取flannel镜像【【每台机器执行】】
# 手动拉取flannel的docker镜像 docker pull easzlab/flannel:v0.11.0-amd64 # 修改镜像名称 docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
下载并安装flannel资源配置清单【仅在master执行】
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
查看fannel是否运行:kubectl get pod -n kube-system
以及查看节点状态:kubectl get node
2》节点网络加入【仅在子节点】
使用kubeadm join 注册Node节点到Matser
节点如何加入,其实在(kubeadm join 的内容,在上面kubeadm init (kubeadm init输出结果的最后已写明) 已经生成了)
kubeadm join 10.0.0.79:6443 --token xxtjuv.v3xbd8b9zie6muab \ --discovery-token-ca-cert-hash sha256:5e7bf9bd4200361259ecd76c4b9a72fcf8ffc5740cf13cb4517e552fac5c4072
查看集群的node状态,安装完网络工具之后,所有节点全部都Ready好了之后才能继续后面的操作
kubectl get nodes
kubectl get pods -n kube-system
至此使用kubeadm的方式安装k8s v1.15完毕
3.14、新节点加入
后续有nodes节点想加入集群的话,由于默认token的有效期为24小时,当过期之后,该token就不可用了,解决方法如下:
1、查看:kubeadm token list
2、重新生成新的token ==> kubeadm token create
3、再次查看:kubeadm token list
4、获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
5、节点接入集群
kubeadm join --token 369tcl.oe4punpoj9gaijh7(新的token) --discovery-token-ca-cert-hash sha256:7ae10591aa593c2c36fb965d58964a84561e9ccd416ffe7432550a0d0b7e4f90(ca证书sha256编码hash值) 主节点Ip:6443 --skip-preflight-chec
3.15、常用命令
//查看节点信息
kubectl get pod -n kube-system
kubectl get pod -n kube-system -w //监视
查看:pod kubectl get pod -n kube-system -o wide
-o wide参数可查看详细信息(属于哪个node)
-w 阻塞窗口持续监视状态(watch)
3.16、测试kubernetes集群
kubectl create deployment nginx --image=nginx
# deployment.apps/nginx created
kubectl describe pod nginx
查看:kubectl get pod -o wide
测试访问:curl 10.244.1.2
四、配置私有化仓库
执行3.9、3.11后进行如下操作。
4.1、基于centos7.4.升级内核、安装docker
在上述每台机器【4台机器】内执行【具体是ip还是域名,看个人配置】
vim /etc/docker/daemon.json "insecure-registries": ["https://hub.k8s.com"] systemctl restart docker
或ip方式:"insecure-registries": ["xx.xx.xx.xx:8081"]
注意,几台机器注意配置host,如果是ip即不用配置
echo "10.0.0.82 hub.k8s.com" >> /etc/hosts
注意上述域名,根据实际情况填写 具体的 域名或者IP即可
"insecure-registries": ["xx.xx.xx.xx:8081"]
4.2、docker-compose安装
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose #给docker-compose执行权限 docker-compose --version #测试安装是否成功,成功的话打印出docker-compose的版本信息
4.3、创建https证书
方式一、最简单方式
mkdir -p /data/cert && chmod -R 777 /data/cert && cd /data/cert openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout harbor.key -out harbor.crt -subj "/CN=hub.k8s.com"
注意域名修改
方式二、去私钥方式
# 创建证书目录,并赋予权限 mkdir -p /data/cert && chmod -R 777 /data/cert && cd /data/cert # 生成私钥,需要设置密码 openssl genrsa -des3 -out harbor.key 2048 # 生成CA证书,需要输入密码 openssl req -sha512 -new \ -subj "/C=CN/ST=JS/L=WX/O=zwx/OU=jhmy/CN=hub.k8s.com" \ -key harbor.key \ -out harbor.csr # 备份证书 cp harbor.key harbor.key.org # 退掉私钥密码,以便docker访问(也可以参考官方进行双向认证) openssl rsa -in harbor.key.org -out harbor.key # 使用证书进行签名 openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt
方式三、官方认证方式
https://goharbor.io/docs/1.10/install-config/configure-https/
4.4、harbor下载
下载地址:https://github.com/goharbor/harbor/releases
wget https://github.com/goharbor/harbor/releases/download/v1.10.4/harbor-offline-installer-v1.10.4.tgz
解压安装单机版【使用https比较麻烦的话,可以直接将下述https注释即可】
#解压 tar -zvxf harbor-offline-installer-v1.10.4.tgz #移动位置 mv harbor /usr/local/ cd /usr/local/harbor # 编辑harbor.yml,修改hostname、https证书路径、admin密码 vim harbor.yml # certificate: /data/cert/harbor.crt # private_key: /data/cert/harbor.keydocke
注意hostname 填写 ip或域名即可
安装
#运行install.sh即可(可带参数--with-notary启用镜像签名,--with-clair启用漏洞扫描) #流程:检查环境 -> 导入镜像 -> 准备环境 -> 准备配置(含移除旧版本)-> 开始启动 ./install
4.5、测试
方式一、浏览器直接访问
这里使用的是ip,故直接访问:10.0.0.82
用户密码:admin/Harbor12345
方式二、其他主机
docker login 10.0.0.82
输入用户密码测试即可
4.5.1、镜像测试,在其他机器
docker pull wangyanglinux/myapp:v1
在library下可以查看到
在项目中标记镜像:
docker tag SOURCE_IMAGE[:TAG] 10.0.0.82/library/IMAGE[:TAG] 如上:docker tag wangyanglinux/myapp:v1 10.0.0.82/library/myapp:v1
推送镜像到当前项目:
docker push 10.0.0.82/library/IMAGE[:TAG] 如上:docker push 10.0.0.82/library/myapp:v1
注意提前登陆下
在当前节点下 删除上述两个 image
docker rmi -f 10.0.0.82/library/myapp:v1
docker rmi -f wangyanglinux/myapp
4.5.2、通过kube使用镜像
library默认是公开的都可以使用
k8s master下
1》启动pod
kubectl run --help 帮助
kubectl run nginx-deployment --image=10.0.0.82/library/myapp:v1 --port=80 --replicas=1
查看deployment:kubectl get deployment # nginx-deployment 1/1 1 1 48s
查看rs:kubectl get rs # nginx-deployment-5fd648dfb 1 1 1 101s
查看pod:kubectl get pod # nginx-deployment-5fd648dfb-hh6l6 1/1 Running 0 3m12s
查看pod容器:kubectl get pod -o wide # nginx-deployment-5fd648dfb-hh6l6 1/1 Running 0 4m14s 10.244.1.6 k8s-node01
可以在对应容器查看,实际run的docker,同时会发现一个pause容器
访问私有ip:curl 10.244.1.6 # Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
访问:curl 10.244.1.6/hostname.html # nginx-deployment-5fd648dfb-hh6l6
4.5.3、更多使用
1》如误删除了pod:kubectl delete pod nginx-deployment-5fd648dfb-hh6l6
使用:kubectl get pod查看,发现又被创建了,因为上述设置了副本为1,所以删除了还是会有的
nginx-deployment-5fd648dfb-ljwf9 1/1 Running 0 23s
2》副本增容:kubectl scale --replicas=3 deployment/nginx-deployment
使用:kubectl get pod查看
nginx-deployment-5fd648dfb-478td 1/1 Running 0 28s
nginx-deployment-5fd648dfb-ljwf9 1/1 Running 0 2m58s
nginx-deployment-5fd648dfb-swtbd 1/1 Running 0 28s
3》副本比较多访问方案:
原方案使用nginx负载一下
参看上文:002-k8s核心概念、Pod、网络通讯方式 中1.2.使用nodeport方案对外映射端口
创建hub
通过:kubectl expose --help查看
查看:service:kubectl get svc
配置:kubectl expose deployment nginx-deployment --port=30000 --target-port=80
查看测试:nginx-deployment ClusterIP 10.1.0.242 <none> 30000/TCP 28s
curl 10.1.0.242:30000 # Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
curl 10.1.0.242:30000/hostname.html # 自由负载 :nginx-deployment-5fd648dfb-478td、nginx-deployment-5fd648dfb-ljwf9、nginx-deployment-5fd648dfb-swtbd
查看ipvsadm:ipvsadm -Ln
TCP 10.1.0.242:30000 rr
-> 10.244.1.7:80 Masq 1 0 0
-> 10.244.2.2:80 Masq 1 0 0
-> 10.244.2.3:80 Masq 1 0 0
查看pod:
nginx-deployment-5fd648dfb-478td 1/1 Running 0 175m 10.244.2.3 k8s-node02 <none> <none>
nginx-deployment-5fd648dfb-ljwf9 1/1 Running 0 177m 10.244.2.2 k8s-node02 <none> <none>
nginx-deployment-5fd648dfb-swtbd 1/1 Running 0 175m 10.244.1.7 k8s-node01 <none> <none>
可以看到互相匹配的
3》外部访问
修改类型:kubectl edit svc nginx-deployment # 将 ClusterIP 转 NodePort
参看svc: kubectl get svc # nginx-deployment NodePort 10.1.0.242 <none> 30000:31805/TCP # 外部访问 IP:31805就可访问了
查看端口开放:netstat -anpt|grep 31805 或者 ss -ant|grep 31805