第一课:k8s介绍安装

tags:

  • golang
  • 2019尚硅谷

categories:

  • K8s

第一节 K8s发展流程

1.1 相关概念

  1. Infrastructure as a Service 基础设置及服务例:阿里云
  2. platform as a service 平台及服务例:新浪云
  3. Software as a Service 软件及服务例:Office 365

1.2 K8s发展历史

  1. Apache的MESOS作为一款分布式资源管理框架最先出世。 但是2019年twiter弃用MESOS,改用K8s(和我们底层相融非常简单)
  2. docker swarm. docker的母公司的产品(非常轻量级几十兆,但是实现的功能非常少)。虽然在大型环境下也可以用(效果也好),但是一般公司不会浪费人力使用它。
  3. kubernetes功能全面,稳定适合公司运行。(成为公司的最佳选择方案),它的靠山是谷歌。作为谷歌10年容器化基础架构中有一个组件叫做borg,非常受欢迎。后来谷歌用Go语言重写了borg组件成为我们的kubernetes。

1.3 K8s特点

  1. 轻量级。消耗的资源小
  2. 开源
  3. 弹性伸缩
  4. 负载均衡:IPVS

1.4 课程架构(需要掌握程度)

适合人群: 软件工程师 测试工程师 运维工程师 软件架构师项目经理
服务分类
- 有状态服务: DBMS (数据库管理系统)
- 无状态服务: LVS APACHE docker更适用于它,但是K8s的目标是有状态服务

  1. 介绍说明: 前世令生 KUbernetes框架 KUbernetes关键字含义
  2. 基础概念: 什么是Pod 控制器类型K8S 网络通讯模式
  3. Kubernetes: 构建K8S集群
  4. 资源清单: 资源掌握资源清单的语法 编写Pod 掌握Pod的生命周期**(这一章是重难点)**
  5. Pod控制器: 掌握各种控制器的特点以及使用定义方式
  6. 服务发现:掌握SVC原理及基构建方式
  7. 存储: 掌握多种存储类型的特点并且能够在不同环境中选择合适的存储方案(要有自己的见解)
  8. 调度器: 掌握调度器原理能够 根据要求把Pod定义到想要的节点运行
  9. 安全:集群的认证 鉴权 访问控制原理及其流程
  10. 运维初试: 修改Kubeadm达到证书可用期限为10年 能够构建高可用的Kubernetes集群

第二节 K8s架构组件

2.1 borg 组件说明

  1. borg 组件架构图如下。
    在这里插入图片描述
  2. Paxos 是谷歌键值对的数据库
  3. BorgMaster主要负责请求的分发。它的副本最好是三个以上的奇数(防单节点故障,而且不会出现,防止出现2票斗两票的情况)
  4. Borglet是真正工作的节点
  5. scheduler(调度器): 任务把数据写到Paxos数据库存储。Borglet会不停的监听Paxos数据库。如果有自己的任务就处理。

2.2 k8s说明

  1. k8s 架构图
    在这里插入图片描述
  2. node 是执行者。上面是领导者。
  3. 领导者中的scheduler。同样负责请求的分发,它把请求给api server,然后api server把它存入到etcd数据库。
  4. 领导者中的(replication controller)用来维护我们的副本数目,也就是期望值的。
  5. kubetcl 是我们的命令行管理工具。
  6. 图中可以看到几乎所有的组件都需要根api server交互,他还是比较繁忙的,后期可以申请一定的缓存。
  7. etcd 用GO语言编写 采用http协议 进行c/s构建的服务
    • etcd的官方将它定位成一个可信赖(天生支持集群化)的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转
    • 推荐在Kubernetes 集群中使用Etcd v3,v2版本已在Kubernetes v1. 11中弃用
    • v2 会把数据全部写入到内存中,v3会持久化到硬盘上。
    • 如果你是用的是比较古老的k8s,需要手动把etcd进行备份。
    • Raft 读写的信息存在这里
    • WAL 预写日志。如果需要对Raft数据进行修改时,先完整备份在增量备份。
    • 它还会实时写入到本地磁盘上Store
      在这里插入图片描述
  8. 那么一个执行者节点中,至少应该用kubelet kube proxy docker(或其他的容器引擎)三个软件
  9. 执行者节点中kubelet会和我们CRI(容器container,运行环境runtime,接口Interface ), 它会与docker交互,操作docker创建对应的容器。维持pod的生命周期
  10. 执行者节点中kube proxy实现pod和pod之间的访问,包括负载均衡。默认操作我们的防火墙去操作我们pod的映射。新版本中还支持IPVS,也就是IVS组件

2.3 k8s组件总结

  1. 主要组件

    • APISERVER:所有服务访问统一入口
    • CrontrollerManager:维持副本期望数目
    • Scheduler: 负责介绍任务,选择合适的节点进行分配任务
    • ETCD: 键值对数据库 储存K8S集群所有重要信息(持久化)
    • Kubelet:直接跟容器引擎交互实现容器的生命周期管理
    • Kube-proxy:负责写入规则至IPTABLES、 IPVS 实现服务映射访问的
  2. 部分重要插件

    • COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析
    • DASHBOARD: 给K8S集群提供一个B/S结构访问体系
    • INGRESS CONTROLLER: 官方只能实现四层代理,INGRESS 可以实现七层代理
    • FEDERATION: 提供一 个可以跨集群中心多K8S统一管理功能
    • PROMETHEUS: 提供K8S集群的监控能力
    • ELK: 提供K8S集群日志统分析接入平台

第三节 K8s基础概念

3.1 pod的概念

在这里插入图片描述

  1. 自主式Pod(不是控制器控制的pod, 死了没人拉起来)
  2. 控制器管理的Pod
    • ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes 中建议使用RepliicaSet来取代ReplicationControlle
    • **ReplicaSet(RS)**跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector
    • 虽然ReplicaSet 可以独立使用,但一般还是建议使用Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling update但Deployment 支持)。
    • Horizontal Pod Autoscaling(HA)仅适用于Deployment 和ReplicaSet ,在V1版本中仅支持根据Pod的CPU利用率扩所容,在vlalpha 版本中,支持根据内存和用户自定义的metric扩缩容
    • StatefulSet是为了解决有状态服务的问题(对应Deployments 和Repl icaSets是为无状态服务而设计),其应用场景包括:
      • *稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
      • *稳定的网络标志,即Pod重新调度后其PodName 和HostName 不变,基于Headless Service(即没有Cluster IP的Service )来实现
      • *有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running 和Ready状态),基于init containers来实现
      • *有序收缩,有序删除(即从N-1到0)
    • DaemonSet确保全部(或者一些) Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet 将会删除它创建的所有Pod。使用DaemonSet的–些典型用法:
      • *运行集群存储daemon, 例如在每个Node. 上运行glusterd、 ceph.
      • *在每个Node 上运行日志收集daemon, 例如f luentd、 logstash。
      • *在每个Node上运行监控daemon, 例如Prometheus Node Exporter
    • Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一一个或多个Pod成功结束Cron Job管理基于时间的 Job,即:
      • 在给定时间点只运行一次
      • 周期性地在给定时间点运行
        在这里插入图片描述

3.2 网络通讯方式

  1. Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE (Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在。而在私有云里搭建Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的Docker 容器之间的互相访问先打通,然后运行Kubernetes。
    • 同一个Pod内的多个容器之间: lo
    • 各Pod之间的通讯: Overlay Network
    • Pod与Service 之间的通讯:各节点的Iptables 规则
  2. Flannel是CoreOS 团队针对Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP 地址之间建立一个覆盖网络(Overlay Network) ,通过这个覆盖网络,将数据包原封不动地传递到目标容器内
    • ETCD之Flannel 提供说明:
      • 存储管理Flannel 可分配的IP地址段资源
      • 监控ETCD中每个Pod 的实际地址,并在内存中建立维护Pod 节点路由表

在这里插入图片描述
3. 同一个Pod内部通讯:同- 一个Pod共享同一个网络命名空间,共享同一个Linux 协议栈
4. Pod1至Pod2

  • Pod1 与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且环同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
  • Pod1 与Pod2在同一台机器,由Docker0 网桥直接转发请求至Pod2, 不需要经过Flannel
  1. Pod至Service 的网络:
    • 目前基于性能考虑,全部为iptables维护和转发Pod到外网:
    • Pod 向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求
    • 外网访问Pod: Service
  2. 只有节点网络是真实网络(只需一张网卡就可实现)
    在这里插入图片描述

第四节 环境的基本安装

4.1 虚拟机中系统环境初始化

  1. 新建虚拟机 安装k8s的节点必须是大于1核心的CPU 内存2G
    • k8s-master仅主机模式(192.168.66.10)
    • k8s-node1仅主机模式(192.168.66.20)
    • k8s-node2仅主机模式(192.168.66.21)
  2. 对上面虚拟机分别配置网络,打开文件vi /etc/sysconfig/network-scripts/ifcfg-ens33,配置网络。重启网络:systemctl restart network。
    IPADDR=192.168.66.10
    NETMASK=255.255.255.0
    GATEWAY=192.168.66.133
    DNS1=192.168.66.1
    DNS2=114.114.114.114 
# 设置主机名
hostnamectl set-hostname k8s-master
# 让每台机子可以相互解析 在添加
vi /etc/hosts
192.168.66.10 k8s-master
192.168.66.20 k8s-node1
192.168.66.21 k8s-node2
192.168.66.100 hub.qnhyn.com
# hosts复制到别的虚拟机
scp /etc/hosts root@k8s-node2:/etc/hosts

# 安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
# 关闭防火墙
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 调整内核参数,对于K8S
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind = 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

sysctl -p /etc/sysctl.d/kubernetes.conf

# 调整系统时区
#设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai 
#将当前的 UTC 时间写入硬件时钟 
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
# 关闭不需要的服务
systemctl stop postfix && systemctl disable postfix

# 设置 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

# 升级系统内核为 4.44(可选)
# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
# 重启后产看内核变化啦
reboot
uname -r
sudo setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭防火墙和ipttables 如果不设置后面加入节点可能有问题如:couldn't validate the identity of the API Server
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sudo sysctl --system

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

4.2 虚拟机Kubeadm部署安装

  1. kube-proxy开启ipvs的前置条件
# 由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
modprobe br_netfilter
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 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 脚本创建了的/etc/sysconfig/modules/ipvs.modules文件, 保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
  1. 安装docker软件
# 安装依赖库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 导入阿里云的镜像仓库
sudo yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 下载安装docker
yum update -y && yum install -y docker-ce
# 创建/etc/docker目录
mkdir /etc/docker
# 设置一下daemon中cgroup为syetemd 默认有两个cgroup 存储文件格式为json-flle,大小为100Mb
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF
# 创建目录存放docker配置文件
mkdir -p /etc/systemd/system/docker.service.d
#重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

第五节 环境的基本安装

5.1安装Kubeadm

# 配置K8S的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
# 安装kubeadm, kubectl, and kubelet.
sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
sudo systemctl restart kubelet
sudo systemctl enable kubelet

5.2 初始化节点

# 生成默认初始化模板
kubeadm config print init-defaults > kubeadm-config.yaml
# 修改默认初始化模板
advertiseAddress: 192.168.66.10 # 修改ip地址
kubernetesVersion: v1.18.0 # 修改版本
# 加上podSubnet(不要忘记啦),如果忘记了 后期安装网络后需要到配置文件中修改。
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
# 添加字段 修改ipvs调度方式
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

# 先拉取所需要的镜像 运行脚本如下 镜像到了阿里云的杭州机房的容器仓库里,拉取还是比较快的
echo ""
echo "=========================================================="
echo "Pull Kubernetes v1.18.0 Images from aliyuncs.com ......"
echo "=========================================================="
echo ""

MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings

## 拉取镜像
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0
docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.2
docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7

## 添加Tag
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.2 k8s.gcr.io/pause:3.2
docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

echo ""
echo "=========================================================="
echo "Pull Kubernetes v1.18.0 Images FINISHED."
echo "into registry.cn-hangzhou.aliyuncs.com/openthings, "
echo "           by openthings@https://my.oschina.net/u/2306127."
echo "=========================================================="

echo ""

# 根据模板初始化节点
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

# 配置一下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装fannel网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如果拉取镜像失败
# https://github.com/coreos/flannel/releases 方仓库下载镜像下载flanneld-v0.12.0-arm64.docker
docker load < flanneld-v0.12.0-arm64.docker
sudo systemctl restart kubelet
kubectl get nodes
kubectl get pod --all-namespaces

# 添加从节点
scp ~/flanneld-v0.12.0-arm64.docker root@k8s-node1:~/
scp ~/flanneld-v0.12.0-arm64.docker root@k8s-node2:~/
docker load < flanneld-v0.12.0-arm64.docker
kubeadm join 192.168.66.10:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:6e09e93318ce8126e04eb924a1c0043719614ac07e6e2203c44a6bdcdd86f4b4 
  1. 如果github下载速度过慢。可以尝试下面阿里云容器镜像服务ACR。
    • https://www.aliyun.com/product/acr
      在这里插入图片描述
docker pull registry.cn-hangzhou.aliyuncs.com/chentging/flannel/flannel:v0.12.0-amd64
 # 为镜像打tag,保持和yaml文件一样。
docker tag registry.cn-hangzhou.aliyuncs.com/chentging/flannel/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64

在这里插入图片描述
2. 成功构建集群环境。
在这里插入图片描述

5.3 Harbor配置私有仓库

  1. Harbor 是一个开源镜像仓库,可通过基于角色的访问控制来保护镜像,新版本的Harbor还增加了扫描镜像中的漏洞并将镜像签名为受信任。作为CNCF孵化项目,Harbor提供合规性,性能和互操作性,以帮助你跨Kubernetes和Docker等云原生计算平台持续,安全地管理镜像。Harbor组件均以Docker容器方式启动,因此,你可以将其部署在任何支持Docker的Linux发行版上。
  2. 安装centos7 192.128.66.100 4G 100G的docker环境。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 修改daemon.json, 因为不需要购买一个https证书,这里做一个局域网内部的证书。
# 四台机器都加上
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries": ["https://hub.qnhyn.com"]
}
EOF
# 重启docker
systemctl restart docker
systemctl restart kubelet
  1. 安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
# 用来拉取文件到xshell中
yum -y install lrzsz
  1. 离线下载Harbor开源镜像仓库
    • 链接: https://pan.baidu.com/s/1IKhBILaocDJkUveG-rXgVQ 提取码: 7bts
# 解压
tar -zxvf harbor-offline-installer-v1.10.1.tgz

# 创建证书目录,并赋予权限
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=qnhyn/CN=hub.qnhyn.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

# 修改配置文件 下面字段
hostname: hub.qnhyn.com
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
harbor_admin_password: Harbor12345

#安装
./install.sh  --with-clair

# 物理机上配置hosts 192.168.66.100  hub.qnhyn.com
https://hub.qnhyn.com/ # 账号admin # 密码 Harbor12345
  1. 测试Harbor开源镜像仓库是否正确安装。
# k8s任意一节点上 用户名admin 密码Harbor12345
docker login https://hub.qnhyn.com
# 推送镜像前必须先标记镜像
docker tag quay.io/coreos/flannel:v0.12.0-amd64 hub.qnhyn.com/library/quay.io/coreos/flannel:v0.12.0-amd64
# 推送镜像
docker push hub.qnhyn.com/library/quay.io/coreos/flannel:v0.12.0-amd64

# 测试myapp
docker pull registry.cn-hangzhou.aliyuncs.com/k8s-t/wangyanglinux:v1
docker tag registry.cn-hangzhou.aliyuncs.com/k8s-t/wangyanglinux:v1 myapp
kubectl run nginx-deployment --image=hub.qnhyn.com/library/myapp --port=80
# 通过详细信息查看ip 10.244.2.4
kubectl get pod -o wide
# 查看部署
kubectl get deployment
# 访问容器
curl 10.244.2.4
curl 10.244.2.4
curl 10.244.2.4/hostname.html
# 进行扩容
kubectl scale -- replicas=3 deployment/nginx-deployment
  1. 在K8S v1.18.0以后,–replicas已弃用 ,推荐用 deployment 创建 pods可以使用
    • kubectl apply -f nginx-deployment.yaml
    • kubectl get pods / kubectl get deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  # 创建2个nginx容器
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  1. 查看Pod中具体错误:kubectl describe pod nginx-app-684bd4f4c-4mdzn
  2. 查看Pod中容器的报错日志:kubectl log myapp-pod -c test(test容器)
  3. 先删除所有的deployment,这里如果只删除pod, 会为了满足预期重启其他pod
    • kubectl delete deployment --all
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐