第一课:k8s介绍安装

2023-11-14

第一课: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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一课:k8s介绍安装 的相关文章

  • 使用百度地图JavaScript实现驾车/公交/步行导航功能

    1 2 3 4 5
  • 【语义分割】12、Fully Attentional Network for Semantic Segmentation

    文章目录 一 背景和动机 二 方法 三 效果 出处 AAAI2022 一 背景和动机 语义分割中 non local NL 的方法起到了很好了捕捉 long range 信息的作用 大致可分为 Channel non local 和 Spa
  • 使用insert into和insert overwrite插入数据的区别【Hive or Odps】

    1 创建一个测试表insert test 标识创建表insert test 默认新增id列 并插入一条数据1 CREATE TABLE insert test AS SELECT 1 AS id 2 插入数据 使用insert into插入
  • 记录:查看ubuntu版本信息。

    cat proc version uname a lsb release a WSL Ubuntu 20 04运行结果 lsb release a 查看Release和Codename uname a 内核版本和操作系统32 64位 cat
  • 32位机内存管理(下)

    既然这样 段描述符表放在那里呢 80386中引入了两个新的寄存器来管理描述符表 一个是48位的全局描述符表寄存器GDTR 一个是16位的局部描述符表寄存器LDTR 那么 为什么有两个描述符表寄存器呢 GDTR指向的描述符表为全局描述符表GD
  • 数据库原理 封锁的粒度

    1 封锁粒度是什么 封锁对象的大小称为封锁的粒度 封锁对象 逻辑单元 物理单元 2 选择封锁粒度的原则 封锁粒度和系统的并发度 系统的开销密切相关 封锁的粒度越大 数据库能够封锁的数据单元就越少 并发度就越小 系统开销也就越小 封锁的粒度越
  • Android三维模型解决方案

    1 原生OpenGL ES 无需多说 虽然OpenGL已经出来这么多年了 但无疑还是现在普及最广的 尤其在移动端 所以用原生OpenGL ES方案可以解决 2 jpct 最推荐 JPCT是一款基于OpenGL技术开发的3D图形引擎 PC环境
  • 数据迁移-jdbc

    1 jdbc工具类 import java io BufferedInputStream import java io FileInputStream import java io InputStream import java util
  • nginx的https和http共存反向代理配置

    一 设置http反向代理 正在上传 重新上传取消 upstream ly com server 192 168 1 100 88 server 192 168 1 101 88 upstream home ly com server 192
  • Git本地项目推送到远程仓库

    目录 1 初始化git 2 添加远程地址并给地址起一个别名 3 合并远程代码 4 推送 5 常见问题 6 无法推送 7 查看远程仓库信息 8 拉取与本地不相关的git项目 9 配置ssh公钥 1 初始化git 进入项目目录 git init
  • np.mgrid

    功能 返回多维结构 常见的如2D图形 3D图形 np mgrid 第1维 第2维 第3维 第n维的书写形式为 a b c c表示步长 为实数表示间隔 该为长度为 a b 左开右闭 或 a b cj cj表示步长 为复数表示点数 该长度为 a
  • R语言实战笔记--第十六章 高级图形进阶

    R语言实战笔记 第十六章 高级图形进阶 标签 空格分隔 R语言 lattice 交互式图形 图形系统简介 本文为R语言实战中最后一章 介绍的是图形的高级进阶 主要讲述了两个包 lattice和ggplot2 以及交互式图形的做法 极大扩展了
  • NacosSpringCloud

    Nacos尝试配置SpringCloud 新来了一个项目 有并发要求 选择了springcloud这套 至于eureka已经闭源了 就没有考虑 最后选择了阿里的nacos 服务发现和配置中心都集中在注册中心 配置支持动态加载 中文文档丰富
  • 视频质量算法有几种的介绍,视频质量技术及编码

    首先介绍SSIM是一种全参考 Full Rerence 视频质量评价算法 全参考视频图像质量评价指标 它分别从亮度 对比度 结构三方面度量视频图像相似性 而全参考评价算法必须同时知道原始视频和失真视频 也就是想计算结构相似度 就得先找到两个
  • 打开win7的系统更新服务器失败,win7的windows update无法启动,手动在服务里启动提示“错误2:系统找不到指定文件...

    您好 该问题有可能是系统文件损坏导致的 建议您尝试以下方法操作 方法一 建议您暂时卸载掉电脑上安装的第三方杀毒软件 再打开控制面板 操作中心 疑难解答 点使用Windows Update 解决问题 根据提示自动修复更新是出现的问题 方法二
  • 关于HttpClient请求获取数据

    httpClient请求获取网站数据 今天一网友问我 他写的httpClient请求为什么获取不到数据 他写的代码如下 StringBuffer buffer new StringBuffer String url1 http api ji
  • 深入云存储系统Swift核心组件:Ring实现原理剖析

    深入云存储系统Swift核心组件 Ring实现原理剖析 简介 OpenStack是一个美国国家航空航天局和Rackspace合作研发的开源云计算项目 并成为Apache下的一个重要开源项目 目前已经发展到了180家公司参与其中 OpenSt
  • MySQL学习笔记

    Windows服务 启动MySQL net start mysql 创建Windows服务 sc create mysql binPath mysqld bin path 注意 等号与值之间有空格 连接与断开服务器 mysql h 地址 P
  • 改造QTabWidget的QTabBar,自绘随意控制样式,不同颜色

    1 简介 本文介绍通过自绘 随意定制QTabWidget的 TabBar的方法 可设置不同Tab页的不同背景色 前景色 边框 鼠标三态色 尺寸 以及绘制其他自定义内容 如角标 2 效果 3 主要思路 继承QTabBar 改尺寸就是重写 ta
  • CSDN周赛60期简要题解

    一转眼 周赛都举办了60期了 还以为可以 寿终正寝 了 结果61期又安排上了 打开一看 还是 计算之魂 主题的周赛 还是这种 4 非编程 2 编程 的题型 可能目前就指望着 计算之魂 主持大局 了 C 站的有生力量全扑在研发 开发各种各样酷

随机推荐

  • Remix 以太坊Solidity IDE搭建与初步使用

    以太坊 因为以太坊为开源社区 虽然东西很优秀 但是组件十分的杂乱 因此首先简单介绍下以太坊的一些常用组件 1 Geth Geth是由以太坊基金会提供的官方客户端软件 用Go编程语言编写的 2 Parity Parity 是对以太坊协议的另一
  • Centos7安装后没有图形界面

    Centos7虚拟机安装好后重启只能进到命令行不能进入图形界面 原因 安装时没有安装图形界面 选择了Minimal Install 解决方法 安装过程中将设置SOFTWARE SELECTION勾选GNOME Desktop gt Deve
  • 如何创建React项目

    前言 构建React项目的几种方式 create react app 脚手架快速搭建 react 项目 推荐 yeoman 脚手架搭建 react 项目 webpack 一步一步构建 react 项目 脚手架是什么 脚手架是一种约定和规范
  • MOS管的作用及原理介绍

    MOS管的英文全称叫MOSFET Metal Oxide Semiconductor Field Effect Transistor 即金属氧化物半导体型场效应管 属于场效应晶体管中的绝缘栅型 因此 MOS管有时被称为场效应管 在一般电子电
  • Modbus RTU 工业通讯技术实现

    Modbus 是一个工业上常用的通讯协议 一种通讯约定 ModBus 协议是应用层报文传输协议 OSI 模型第7层 它定义了一个与通信层无关的协议数据单元 PDU 即PDU 功能码 数据域 ModBus 协议能够应用在不同类型的总线或网络
  • javaWeb中如何防止两个人同时操作同一条记录(限制单人操作),使用redis的解决方式

    最近在做demo的时候 碰到这么一个问题 当页面上同一角色有两个人登录的时候 他们同时操作统一条记录 简言之就是 同一记录同一时刻多人操作 这种情况在我的业务中回导致数据的冗余 干扰正常的程序运行 当时想到的解决办是锁表或者使用缓存 当然其
  • h0105 (10 分) c/c++

    c 代码 include
  • 互联网摸鱼日报(2023-03-29)

    互联网摸鱼日报 2023 03 29 InfoQ 热门话题 阿里再启组织变革 六大业务集团全面独立经营 张勇 具备条件的业务都可能独立上市 新一代Serverless事件中间件EventMesh正式毕业为Apache顶级项目 杭银消金基于
  • AVR单片机ATemga328P中断原理的介绍

    1 一AVR单片机中断原理的介绍 ATmega328P微控制器具有两个外部中断引脚 分别是INT0和INT1 外部中断0 INT0 它对应的引脚是PD2 数字引脚2 INT0可以用于响应外部信号的边沿触发 上升沿 下降沿或任意边沿 并触发相
  • 深聊全链路压测之:第二十讲

    日志隔离落地方案 1 引言 2 Demo预演 2 1 技术方案选型 2 2 Demo系统预演 2 3 扩展知识 日志分离 3 总结 1 引言 这节课 我们来学习如何基于微服务技术落地日志隔离 从第14讲开始 我们就详细的落地了基于微服务技术
  • linux服务器怎么添加路由,linux系统中添加路由的方法

    linux系统中添加路由的方法 发布时间 2020 06 17 11 38 59 来源 亿速云 阅读 95 作者 Leah 这篇文章将为大家详细讲解有关linux系统中添加路由的方法 小编觉得挺实用的 因此分享给大家做个参考 希望大家阅读完
  • Android webview实现h5视频全屏播放兼容Android7.0,自己添加webview库兼容全部版本

    2017年Android5 0主流机型webview的兼容性出现大问题导致很多公司app都不使用h5播放视频 关于谷歌自带的webview有各种兼容问题 最典型的的就是视频全屏onShowCustomView经常会点击不回调 可能是谷歌推崇
  • sonar scanner配置

    sonar scanner配置 这里记录如何配置sonar scanner扫描C C 项目代码 话不多说 先上官网链接 文章目录 sonar scanner配置 1 环境 1 1 SonarSource Build Wrapper 1 2
  • UDP及TCP通信对比讲解

    概述 TCP是面向连接的协议 也就是说在通信发送数据前 必须和对方建立连接 以数据流的模式传播 传输过程中不会有数据丢失 速率上比UDP要慢不少 适用于对数据准确性要求高 速度可以相对慢的场景 如发送或接收邮件 打电话 微信消息传输等等 U
  • 一看就懂的网络协议五层模型(一)

    我们每天使用互联网 你是否想过 它是如何实现的 全世界几十亿台电脑 连接在一起 两两通信 上海的某一块网卡送出信号 洛杉矶的另一块网卡居然就收到了 两者实际上根本不知道对方的物理位置 你不觉得这是很神奇的事情吗 互联网的核心是一系列协议 总
  • 【VSCode远程调试】【Python】Linux/Ubuntu远程服务器使用plt.show()没有反应

    plt模块结合numpy数组的可视化的常见用法 import matplotlib pyplot as plt img np array 1 2 3 4 plt imshow img plt show 以上写法在linux或者ubuntu系
  • mysql重命名一个表

    使用rename table rename table table1 altered to table 这里的sql语句会将table1 altered 重命名为table rename语句还可以将表移到另一个数据库中 rename tab
  • 14. 函数返回值为引用?

    函数返回值可以是引用吗 当然可以 只是在函数返回引用的时候需要注意几点 以下给出讨论 函数在返回值的时候 会产生一个临时变量作为函数返回值的副本 而函数在返回引用的时候 不会产生副本 那么既然是引用 那么到底是引用谁呢 首先 我们知道要清楚
  • 解决dubbo注册zookepper服务IP乱入问题的三种方式

    最近做一个项目引入了dubbo zookepper的分布式服务治理框架 在应用的发布的时候出现一个怪问题 zookepper服务是起在开发服务器192 168 23 180上 本机起应用服务提供者注册到192 168 23 180上的dub
  • 第一课:k8s介绍安装

    第一课 k8s介绍安装 tags golang 2019尚硅谷 categories K8s 文章目录 第一课 k8s介绍安装 第一节 K8s发展流程 1 1 相关概念 1 2 K8s发展历史 1 3 K8s特点 1 4 课程架构 需要掌握