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

#4uname -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
View Code

方式三、官方认证方式

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

  

 

 

 

posted @ 2020-08-27 17:20  bjlhx15  阅读(823)  评论(0编辑  收藏  举报
Copyright ©2011~2020 JD-李宏旭