K8s+Docker+KubeSphere+DevOps笔记

K8s+Docker+KubeSphere+DevOps

  • 前言
  • 一、阿里云服务器开通
  • 二、docker基本概念
    • 1.一次构建、到处运行
    • 2、docker基础命令操作
    • 3、docker进阶操作
      • 1.部署redis中间件
      • 2.打包docker镜像
  • 三、kubernetes 大规模容器编排系统
    • 1、基础概念:
      • 1、服务发现和负载均衡
      • 2、存储编排
      • 3、自动部署和回滚
      • 4、自动完成装箱计算
      • 5、自我修复
      • 6、密钥与配置管理
    • 2、架构
      • 1、工作方式
      • 2、组件架构
        • a、kube-apiserver
        • b、etcd
        • c、kube-scheduler
        • d、kube-controller-manager
        • e、cloud-controller-manager
        • f、Node 组件
        • g、kubelet
        • h、kube-proxy
    • 3、集群搭建
      • 1、基础环境、所有服务器执行
        • a、安装docker环境
        • b、服务器基础设置
      • 2、k8s初始化master节点:
        • a、kubeadm reset 初始化错误重置
        • b、kubeadm init 初始化成功
        • c、工作节点h5和h9
        • d、网络配置
          • 1、kubectl get nodes
          • 2、主节点运行
          • 3、令牌失效,生成新令牌
      • 4、安装k8s可视化界面,dashboard
        • 1、安装
        • 2、查看容器启动状态
        • 3、修改集群的web访问界面端口暴露出来等同于docker -p端口映射选项
        • 4、找到映射端口
        • 5、访问
  • 四、k8s核心实战
    • 1、命令行
    • 2、NameSpace
    • 3、pod 需要图片
    • 4、Deployment:自愈、扩缩容
    • 5、service:pod的服务发现与负载均衡
    • 6、 ingress:svc的统一网关入口


前言

提示:这里可以添加本文要记录的大概内容:


提示:以下是本篇文章正文内容,下面案例可供参考

一、阿里云服务器开通

在这里插入图片描述
云服务器ECS–实例–选区–创建–付费模式(按量付费)–服务器架构选择(包含服务器内存及数量)–镜像(操作系统)–选择实例基础存储–确认购买–选择网络(默认或选择自建的vpc)–网络安全组、分配公网ip(远程访问:固定带宽或者流量、访问部分端口须安全组开放端口)–系统配置(密码、服务器名称)–创建实例

集群网络规划:
专有网络VPC创建:私有网络、专有网络(划分网段)
专有网络–创建–名称–ipv4网段–创建交换机(子网–名称–可用区–)–

连接工具electerm: https://electerm.github.io/electerm

二、docker基本概念

1.一次构建、到处运行

https://baijiahao.baidu.com/s?id=1651403959832263386&wfr=spider&for=pc
三要素:镜像、容器、仓库

2、docker基础命令操作

#容器运行命令
docker run  --name=zidingyi   -d(后台)  --restart=always(开机自启) -p(映射)  88(主机):80(容器)   images#挂载数据到外部修改(主机目录为空,容器内同为空)
docker run  --name=zidingyi   -d(后台) \
--restart=always(开机自启) -p(映射)  88(主机):80(容器)\
-v  主机目录:容器目录:ro(容器内只读、rw)   images#查看正在运行中的
docker ps
#查看所有
docker ps -a
#删除停止/强制删除运行的容器
docker rmi/rm -f images/id
#停止/启动容器
docker  stop/start  iamges
#更新配置
docker update  images  --restart=always
#交互式容器命令
docker exec -it  id   /bin/bash或/bin/sh
#容器提交改变(修改好)可生成一个新镜像
docker commit  -a (作者) -m "变化标签"  image_id   image_new_name:ver
#镜像保存传输加载(离线操作)
docker save  -o   name.tar  images:ver
docker load  -i  name.tar  docker export  images_id > name.tar
cat name.tar | docker import - 仓库/image_name:version#镜像推送到远程仓库tag 修改镜像标签,仓库/镜像:版本都可改
docker tag local-image:tagname  wangjch/images:tagnamedocker login   #登录docker hub
docker push wangjch/images:tagname   #提交推送
docker logout
#公有镜像下载
docker pull  wangjch/images:tag
#查看日志排错
docker logs  image/id
#镜像的net、image、volunm 等内部细节
docker inspect  image/id
#复制容器内文件到本机
docker cp  id:容器目录   本机目录
docker cp  本机目录   id:容器目录
#/docker构建镜像
docker build  -t  java-daemon:v1.0 -f ./DockerFile
#/docker network不同服务器之间容器的互联通信以及端口映射
容器ip变动时可以通过服务名直接网络通信不受影响
docker network create net_name
docker network connect net_name container1
#同服务器下,network链接
docker run -it --network net_name  image
##虚悬镜像查看删除。
docker image ls -f dangling=true
docker image prune
##docker compose
https://docs.docker.com/compose/compose-file/
docker compose   up/down 直接创建删除
##
docker swarm 

3、docker进阶操作

https://start.spring.io/
在这里插入图片描述

1.部署redis中间件

docker pull redis#docker run 使用自定义配置文件启动命令   (--privileged=true  -v挂载权限不够时)(继承--volumes-from  父类name)
#创建redis.conf配置文件
docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \
-v  /data/myredis/data:/data/redis/data
-d  --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf   #(自定义启动命令\指定容器内配置文件)

2.打包docker镜像

FROM  基础镜像
RUN  容器构建是需要的命令  
WORKDIR 指定创建容器后,登陆时的工作目录。
USER 指定用户 
ENV 用于构建过程中设置环境变量
ADD  将宿主机的文件拷贝进镜像且自动处理url和解压tar压缩包
COPY  拷贝文件和目录到镜像中。
VOLUME 容器卷 -v
EXPOSE  端口暴露 -p
CMD 指令会被docker run后面的指令所取代。
ENTRYPOINT 容器启动时运行的命令但不会被docker run后面的命令取代,并作为参数

微服务

#dockerfile
FROM openjdk:8-jdk-slim   ##环境
LABEL   maintainer=wangjch#复制本地jar包到容器内
COPY  target/*.jar   /app.jar
COPY  target/*.yml   /app.yml
##ADD  app.jar   docker.jar
#镜像启动命令
ENTRYPOINT ["java" ,"-jar","app.jar"]
# docker构建镜像
docker build  -t  java-daemon:v1.0 -f ./DockerFile
#运行容器
docker run  -d -p 8080:8080  \
-v  /data/app-java/app.yml:/app.yml--name myjava java-daemon:v1.0
#推送到远程仓库
docker tag  java-daemon:v1.0  wangjch/java-daemon:v1.0
docker push wangjch/java-daemon:v1.0
#拉取镜像
docker pull wangjch/java-daemon:v1.0

三、kubernetes 大规模容器编排系统

1、基础概念:

1、服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

2、存储编排

Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

3、自动部署和回滚

你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

4、自动完成装箱计算

你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

5、自我修复

Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

6、密钥与配置管理

Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

2、架构

1、工作方式

k8s cluster = N Master Node + N Worker Node : N >=1

2、组件架构

在这里插入图片描述
控制组件controller manager、对接组件apiserver(控制节点的交互唯一入口、通知记录存储)、调度组件scheduler监视选择优先Node运行pod、存储组件etcd、代理组件proxy之间互相同步(访问所有项目的入口)、cloud provider api 与外部云链接控制(cloud controller manager)
在这里插入图片描述

a、kube-apiserver

API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。

Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。

b、etcd

一致且高度可用的键值存储,用作 Kubernetes 的所有集群数据的后台数据库。

如果你的 Kubernetes 集群使用 etcd 作为其后台数据库, 请确保你针对这些数据有一份 备份计划。

你可以在官方文档中找到有关 etcd 的深入知识。

c、kube-scheduler

kube-scheduler 是控制平面的组件, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。

d、kube-controller-manager

kube-controller-manager 是控制平面的组件, 负责运行控制器进程。

从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。

这些控制器包括:

节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。

e、cloud-controller-manager

一个 Kubernetes 控制平面组件, 嵌入了特定于云平台的控制逻辑。 云控制器管理器(Cloud Controller Manager)允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。
cloud-controller-manager 仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的集群不需要有云控制器管理器。

与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中, 供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
路由控制器(Route Controller):用于在底层云基础架构中设置路由
服务控制器(Service Controller):用于创建、更新和删除云提供商负载均衡器

f、Node 组件

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。

g、kubelet

kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。

kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

h、kube-proxy

kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。

3、集群搭建

1、基础环境、所有服务器执行

a、安装docker环境

#下载镜像
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo#安装docker
yum -y install docker-ce  docker-ce-cli containerd.io   (ver20.10.7、1.4.6)#docker镜像国内加速
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsystemctl  daemon-reload
#立即启用docker并开机自启
systemctl enable docker --now

b、服务器基础设置

#各个机器设置自己的域名
hostnamectl set-hostname xxxx# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/configsed -i 's/^SELINUX=disabled$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstabsystemctl disable firewalld.service --now
systemctl disable NetworkManager --now
ntp时间同步rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpmntpdate time2.aliyun.com
crontab -e
*/5 * * * * ntpdate time2.aliyun.com/etc/rc.local
ntpdate time2.aliyun.comulimit -SHn 65535#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness = 0 # 禁止使用 swap 空间,只有当系统 0OM 时才允许使用它vm.overcommit memory=1 # 不检查物理内存是否够用
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
net.ipv4.ip_forward = 1
EOFsysctl --systemsysctl -p /etc/sysctl.d/k8s.conftimedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0systemctl restart rsyslog crond
systemctl stop postfix && systemctl disable postfix
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=5mRateLimitInterval=30sRateLimitBurst=1000
# 最大占用空间 19G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 
syslogForwardToSyslog=no
EOF
systemctl restart systemd-journald
yum install wget jg pamisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 -yyum install ipvsadm ipset sysstat contrack libseccomp -y
#安装命令补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
2、永久生效
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4 / nf_conntrack
cat  << EOF > /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ng_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
 systemctl enable systemd-modules-load --now
 lsmod | grep -e ip_vs -e nf_conntrack
#导入签名key,这是elrepo仓库公共秘钥,(3.0以上内核引入签名机制)以及仓库源,
#文档地址http://elrepo.org/tiki/HomePage
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install   http://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm#查看可安装版本
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64#选择ml或者lt版本安装
# 安装 ML 最新版本
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
# 安装 LT长期支持版本
yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y#查看现有内核启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg#修改默认启动项
grub2-set-default 0 从0计数,grub2-set-default 0和/etc/default/grub文件里的GRUB_DEFAULT=0意思一样看新版本为那个序号一般为0
#关闭 NUMA
cp /etc/default/grub{,.bak}vim /etc/default/grub # 在 GRUB_CMDLINE_LINUX 一行添加numa=off’参数,如下所示:diff /etc/default/grub.bak /etc/default/grub<GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet"
GRUB CMDLINE LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet numa=off"cp /boot/grub2/grub.cfg[,.bak}#重新生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#重启检查版本即可
https://baijiahao.baidu.com/s?id=1750085573442213926&wfr=spider&for=pc

haproxy + keepalived
haproxy 配置

 grep -E -v  "^*#|^$" /etc/haproxy/haproxy.cfg 
globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemonstats socket /var/lib/haproxy/stats
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000
frontend  main  *:16443acl url_static       path_beg       -i /static /images /javascript /stylesheetsacl url_static       path_end       -i .jpg .gif .png .css .jsuse_backend  k8s-master          if url_staticdefault_backend             k8s-master
listen stats bind   *:8006mode   httpstats  enablestats  hide-versionstats  uri   /statsstats  refresh  30s stats  realm   Haproxy\ statisticsstats  auth  admin:P@ssword
backend k8s-masterbalance     roundrobinserver      k8s-master-01 192.168.220.128:6443 checkserver      k8s-master-02 192.168.220.129:6443 checkserver      k8s-master-03 192.168.220.130:6443 check

keepalived 配置

[root@h1 k8s]# grep -E -v  "^*#|^$" /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {router_id k8s-master-01 ##主备不同vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51 ##主备相同priority 100  ##权重逐级减小advert_int 1authentication {auth_type PASSauth_pass 10086}virtual_ipaddress {  192.168.200.100   ##vip}
}

2、k8s初始化master节点:

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

k8s服务对应默认端口

Kubernetes API server: Port 6443 (secure) or 8080 (insecure).
kubelet API: Port 10250 (default).
Kubernetes DNS service (CoreDNS): Port 53 (TCP and UDP).
etcd: Ports 2379 (client communication) and 2380 (server-to-server communication).
kube-proxy: Port 10256 (default).
kube-scheduler: Port 10251 (default).
kube-controller-manager: Port 10252 (default).
Container runtime (e.g. Docker): Typically uses port 2375 (insecure) or 2376 (secure).
Prometheus monitoring: Port 9090 (default).
Grafana dashboard: Port 3000 (default).

##镜像下载:

##无魔法上网下载镜像
cat << EOF > image_download.sh 
#!/bin/bash
images_list='
daocloud.io/daocloud/kube-apiserver:v1.26.0
daocloud.io/daocloud/kube-controller-manager:v1.26.0
daocloud.io/daocloud/kube-scheduler:v1.26.0
daocloud.io/daocloud/kube-proxy:v1.26.0
daocloud.io/daocloud/conformance:v1.26.0
daocloud.io/daocloud/pause:3.7
daocloud.io/daocloud/etcd:3.5.3-0
daocloud.io/daocloud/coredns/coredns:v1.8.6'for i in $images_list
dodocker pull $i
done
EOF

##镜像上传

## 上传到自己的docker hub
[root@h1 k8s]# cat << EOF > images_push.sh 
#!/bin/bash
images_list='
daocloud.io/daocloud/kube-apiserver:v1.26.0
daocloud.io/daocloud/kube-controller-manager:v1.26.0
daocloud.io/daocloud/kube-scheduler:v1.26.0
daocloud.io/daocloud/kube-proxy:v1.26.0
daocloud.io/daocloud/conformance:v1.26.0
daocloud.io/daocloud/pause:3.7
daocloud.io/daocloud/etcd:3.5.3-0
daocloud.io/daocloud/coredns/coredns:v1.8.6'
images_target='
wangjch/kube-apiserver:v1.26.0
wangjch/kube-controller-manager:v1.26.0
wangjch/kube-scheduler:v1.26.0
wangjch/kube-proxy:v1.26.0
wangjch/conformance:v1.26.0
wangjch/pause:3.7
wangjch/etcd:3.5.3-0
wangjch/coredns/coredns:v1.8.6'
for i in $images_list
dofor im in $images_target dodocker tag $i $imdocker push $imdone
done
EOF

a、kubeadm reset 初始化错误重置

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
EOFyum install -y kubelet kubeadm kubectlcat  /etc/profile
#export DOCKER_CGROUP=$(docker info | grep "Cgroup D" | cut -d ' '  -f4)
export DOCKER_CGROUP=systemdsystemctl enable kubelet && systemctl start kubelet

kubeadm config print init-defaults >> kubeadm-config.yaml
kubeadm config migrate --old-config kubeadm-config.yaml --nwe-config new.yaml
kubeadm config images list
kubeadm config images pull --config new.yaml

kubeadm init  \
--apiserver-advertise-address=192.168.174.44 \
--control-plane-endpoint=h4 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v版本号\
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=172.168.0.0/16
--xri-socket unix:///var/run/containerd/containerd.sock
##解释:apiserver-advertise-address=(master节点所在的ip)
control-plane-endpoint=cluster-endpoint  (/etc/hosts中master主机名)
image-repository registry.aliyuncs.com/google_containers (镜像仓库地址,此为官方)
##service-cidr、pod-network-cidr所有网络与主机ip范围不重叠。

#生成kubeadm-config文件
kubeadm config print init-defaults > kubeadm-config.yaml

vim kubeadm-config.yamlapiVersion: kubeadm.k8s.io/v1beta2 #使用的API版本
bootstrapTokens: #引导令牌的设置
- groups: #组设置- system:bootstrappers:kubeadm:default-node-token #指定默认节点令牌token: 7t2weq.bjbawausm0jaxury #节点令牌的值ttl: 24h0m0s #节点令牌的过期时间usages: #用途设置- signing #签名- authentication #身份验证
kind: InitConfiguration #初始化配置
localAPIEndpoint: #本地Kubernetes API的端点设置advertiseAddress: 192.168.220.128 #广告地址,即API服务器将用于在此地址上公开它自己bindPort: 6443 #绑定端口,即API服务器将用于此端口公开它自己
nodeRegistration: #节点注册信息criSocket: /run/containerd/containerd.sock #容器运行时的socketname: k8s-master01 #节点名称taints: #节点容忍设置- effect: NoSchedule #不允许在该节点上调度新的Podkey: node-role.kubernetes.io/master #键是节点角色的标签,这里是标记为master的节点
---
apiServer: #API服务器的设置certSANs: #证书的主体名称设置- 192.168.220.128 #证书的主体名称timeoutForControlPlane: 4m0s #控制平面操作的超时时间
apiVersion: kubeadm.k8s.io/v1beta2 #使用的API版本
certificatesDir: /etc/kubernetes/pki #证书目录
clusterName: kubernetes #集群名称
controlPlaneEndpoint: ”192.168.200.100:16443“  #控制平面的地址,这里是通过VIP来实现高可用
controllerManager: {} #控制器管理器的配置
dns: #DNS设置type: CoreDNS #使用的DNS插件
etcd: #etcd存储配置local: #本地etcd的配置dataDir: /var/lib/etcd #数据目录
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #容器镜像仓库地址
kind: ClusterConfiguration #集群配置
kubernetesVersion: v1.23.1 #使用的Kubernetes版本
networking: #网络配置dnsDomain: cluster.local #DNS域名podSubnet: 172.16.0.0/12 #Pod的IP地址段serviceSubnet: 192.168.0.0/16 #Service的IP地址段
scheduler: {} #调度器的配置

常见错误:

一、Oct 08 20:31:27 k8s-master01 kubelet[3189]: E1008 20:31:27.600468 3189 run.go:74] “command failed” err=“failed to load kubelet config file, error: failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file “/var/lib/kubelet/config.yaml”, error: open /var/lib/kubelet/config.yaml: no such file or directory, path: /var/lib/kubelet/config.yaml”
解决办法:执行kubeadm init就会生成相应的配置文件二、Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the ‘criSocket’ field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher
解决办法:加选项指定使用的CRI三、Error getting node" err=“node “k8s-master01” not found”
解决办法:这种情况是apiserver-advertise-address地址有误
kubeadm config print init-defaults > kubenetes-init-config
vim kubenetes-init-config四、failed pulling image "registry.k8s.io/pause:3.6
cri-docker会去拉pause镜像,因为镜像库原因可能拉不成功,我们需要在cri-docker.service文件中配置相应的镜像地址
注意:–network-plugin=留空,不要和网上傻不拉几的去填cni。网络的等集群创建好在配置
sed -ie ‘s#ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --network-plugin= --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8#g’ /usr/lib/systemd/system/cri-docker.servicegithub提供的镜像加速,下载github东西用这个前缀可以
https://ghproxy.com/
cat /etc/kubernetes/kubelet.conf apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

kubelet --config=/etc/kubernetes/kubelet.conf
E0328 09:18:25.463707 83231 run.go:74] “command failed” err=“failed to validate kubelet flags: the container runtime endpoint address was not specified or empty, use --container-runtime-endpoint to set”

 kubelet --config=/etc/kubernetes/kubelet.conf --container-runtime=remote --container-runtime-endpoint=unix:///var/run/docker.sock
apiVersion: kubelet.config.k8s.io/v1beta1  # 指定Kubelet配置文件的API版本
kind: KubeletConfiguration  # 指定Kubelet的类型为KubeletConfiguration
cgroupDriver: systemd  # 指定容器运行时使用的cgroup驱动为systemd
clusterDNS:  # 指定集群DNS的地址
- 10.96.0.10
clusterDomain: cluster.local  # 指定集群的域名
featureGates:  # 定义功能开关,控制特定功能是否启用RotateKubeletServerCertificate: true  # 开启自动轮换Kubelet证书的功能
authentication:  # 配置Kubelet的认证方式anonymous:  # 配置匿名认证enabled: false  # 禁用匿名认证webhook:  # 配置Webhook认证enabled: true  # 启用Webhook认证x509:  # 配置x509证书认证clientCAFile: /etc/kubernetes/pki/ca.crt  # 客户端CA证书文件路径
authorization:  # 配置Kubelet的授权方式mode: Webhook  # 使用Webhook模式授权
serverTLSBootstrap: true  # 启用自动为Kubelet生成证书的功能
tlsCertFile: /etc/kubernetes/pki/kubelet.crt  # Kubelet证书文件路径
tlsPrivateKeyFile: /etc/kubernetes/pki/kubelet.key  # Kubelet私钥文件路径
containerRuntime: remote  # 指定容器运行时为远程的容器运行时
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock  # 指定容器运行时的终端点,这里使用了containerd运行时

b、kubeadm init 初始化成功


Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:
##创建mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:
##root用户export KUBECONFIG=/etc/kubernetes/admin.confYou can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
### 加入主节点kubeadm join h4:6443 --token n6xtqm.79qrkwskxnzaypp5 \--discovery-token-ca-cert-hash sha256:ce62bcec7deeb91822685bc78a87699906b8a6681b0d51e31427603bfe63a42f \--control-plane Then you can join any number of worker nodes by running the following on each as root:
### 加入工作节点,
kubeadm join h4:6443 --token n6xtqm.79qrkwskxnzaypp5 \--discovery-token-ca-cert-hash sha256:ce62bcec7deeb91822685bc78a87699906b8a6681b0d51e31427603bfe63a42f 

c、工作节点h5和h9

kubeadm join h4:6443 --token n6xtqm.79qrkwskxnzaypp5
–discovery-token-ca-cert-hash sha256:ce62bcec7deeb91822685bc78a87699906b8a6681b0d51e31427603bfe63a42f

d、网络配置

1、kubectl get nodes

在这里插入图片描述

2、主节点运行

修改文件calico.yaml
–pod-network-cidr=172.168.0.0/16
初始化master节点时,该范围ip与calico.yaml文件中须一致,下载完成后修改,再apply。
CALICO_IPV4POOL_CIDR
在这里插入图片描述

curl https://docs.projectcalico.org/manifests/calico.yaml -Okubectl apply -f calico.yaml

如遇以下报错:说明版本不对

error: unable to recognize "calico.yaml": no matches for kind "PodDisruptionBudget" in version "policy/v1"
在calico.yaml文件里面找到PodDisruptionBudgt前面的apiVersion:v1后面加上beta1改为apiVersion:v1beta1

错误原因是k8s不支持当前calico版本,如果你使用的是1.20版本的k8s,可安装v3.21版本的Calico,具体版本对应关系见系统要求

#下载其他版本
curl https://docs.projectcalico.org/v3.18/manifests/calico.yaml -O
curl https://docs.projectcalico.org/archive/v3.21/manifests/calico.yaml -O
kubectl apply -f calico.yaml
3、令牌失效,生成新令牌
kubeadm token create --print-join-command

在这里插入图片描述

4、安装k8s可视化界面,dashboard

1、安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

2、查看容器启动状态

kubectl get pod -A

3、修改集群的web访问界面端口暴露出来等同于docker -p端口映射选项

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboardtype: ClusterIP 改为 type: NodePort

4、找到映射端口

kubectl get svc -A |grep kubernetes-dashboard

在这里插入图片描述

5、访问

https://集群任意IP:30753

在这里插入图片描述
创建用户

kubectl apply -f dash.yaml
#创建访问账号,准备一个yaml文件; vim dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard

#获取访问令牌token

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

四、k8s核心实战

1、命令行

kubectl apply -f yaml文件

2、NameSpace

名称空间,对集群资源进行隔离划分。默认只隔离资源,不隔离网络。

#获取所有名称空间
kubectl get ns 
#列出某命名空间下所有pod
kubectl  get pod -n   namepasce_name
#创建/删除名称空间
kubectl create/delete  ns  hello

##创建
vim hello.yaml && kubectl apply -f hello.yaml

apiVersion: v1
kind: Namespace
metadata:name: hello

##删除
kubectl delete -f hello.yaml

3、pod 需要图片

#启动pod
kubectl  run  mynginx  --image=nginx
#查看默认命名空间中pod运行状况
kubectl get pod  (-n deafult )
#查看pod具体运行日志
kubectl describe mynginx
#删除pod
kubectl delete pod mynginx
# 查看Pod的运行日志
kubectl logs Pod名字
# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136
apiVersion: v1
kind: Pod
metadata:labels:run: myappname: myappnamespace: default
spec:containers:- image: nginxname: mynginx- image: redisname: myredis

kubectl logs Pod名称

4、Deployment:自愈、扩缩容

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

# 自愈能力、故障转移
kubectl create deployment mytomcat --image=tomcat:8.5.68   --replicas=3(副本数)
#获取
kubectl get deploy
#删除
kubectl delete deploy tomcat
#扩、缩容
kubectl  scale  deploy/my-dep  --replicas= 
kubectl  edit  deploy  my-dep

##滚动更新

#升级
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
#查看历史记录
kubectl rollout status deployment/my-dep  
kubectl rollout history deployment/my-dep  
#回退
kubectl rollout undo deployment/my-dep  --to-revision=1 

在这里插入图片描述

5、service:pod的服务发现与负载均衡

#获取svc

kubectl  get  pod  --show-labels    查看pod标签
kubectl  get  service

在这里插入图片描述

#删除svc
kubectl delete service my-dep

#端口暴露提供负载均衡。
kubectl expose deploy my-dep --port=8000 (svc端口) --target-port=80(pod端口) --type=ClusterIP(集群内部的访问) / --type=NodePort (集群外也可以访问)
域名规则:服务名.所在名称空间.svc
my-dep.default.svc

6、 ingress:svc的统一网关入口

ingress是一种通过http协议暴露kubernetes内部服务的api对象,即充当Edge Router边界路由器的角色对外基于七层的负载均衡调度机制,能够提供以下几个功能:

负载均衡,将请求自动负载均衡到后端的Pod上;
SSL加密,客户端到Ingress Controller为https加密,到后端Pod为明文的http;
基于名称的虚拟主机,提供基于域名或URI更灵活的路由方式

kubectl get

kubectl discribe pod name

nfs
pv 持久卷
pvc 动态、静态创建持久卷声明

创建配置集configmap

kubectl create cm redis-conf --from-file=redis.conf

kubesphere

默认存储类型动态供用。nfs

https://registry.hub.docker.com/_/mysql
应用仓库:
helm.sh
https://charts.bitnami.com/bitnami
ruoyi-cloud
https://gitee.com/zhangmrit/ruoyi-cloud/blob/nacos/doc/ruoyi-cloud.png
ideal.exe
https://gitee.com/leifengyang/RuoYi-Cloud
nacos 系统部署配置
https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html

部署应用
1、应用的部署方式(无状态、有状态、守护进程集)
2、应用的数据挂载(存储:数据、配置文件)
3、应用的可访问性(svc:nodeport、clusterport)

微服务上云,

中间件:mysql库迁移,redis部署。
nacos集群部署(有状态服务部署stateful)
ping 域名 域名规则:服务名.所在名称空间.svc 集群

dockerfile:

FROM   镜像
LABEL  标签VOLUME  卷挂载目录
COPY  target/*.jar   /home/appname.jar
ENV  参数(动态指定配置文件中的值)key="value"
#ENV ARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"EXPOSE  暴露端口
RUN  ["" , "", "容器启动命令"]

微服务模块制作镜像

打包:maven打成可执行jar,上传到服务器
制作镜像:根据Dockerfile生成指定镜像

docker build -t name:version -f Dockerfile  .

推送镜像:将镜像推送给docker hub

docker logindocker tag docker pushdocker pull

应用部署:
nginx配置文件 : server_host _;

● npm install --registry=https://registry.npm.taobao.org 安装项目依赖
● npm run build 对项目打包,
● 打包完成后把 .nuxt ,static, nuxt.config.js, package.json 这四个关键文件复制到 node 环境。先npm install再使用npm run start 即可运行

存活检查:健康检查器–添加容器就绪检查–存活检查(探针:请求命令)

网络访问:
生产环境与开发环境配置分离。

java打包编译:
mvn clean package -Dmaven.test.skip=true ##清除old包,跳过测试。

mvn -o -Dmaven.test.skip=true -gs pwd/configuration/settings.xml clean package

构建镜像:
在这里插入图片描述
openssl x509 -in api.crt -text -noout

go 中文社区下载,解压,配置环境变量

git clone https://github.com/kubernetes/kubernetes.gits

kubeadm version
切换版本
git checkout -b remotes/origin/release-1.15.1 v1.15.1

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码&#xff08;包含以上代码&#xff09; 基本属性 信号 一、信号种类 //当前项发生变化时触…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

使用Pandas处理Excel文件

Excel工作表是非常本能和用户友好的&#xff0c;这使得它们非常适合操作大型数据集&#xff0c;即使是技术人员也不例外。如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方&#xff0c;请不要再找了。你来对地方了。 在本文中&#xff0c;您将学习如何使用Pan…

怎样做好日志分析?

首先我们要知道日志分析是指检查并理解计算机生成的日志消息&#xff0c;例如日志事件或审计来跟踪记录&#xff0c;通过日志分析可以帮助您诊断和解决计算机系统中的问题&#xff0c;以及监视系统性能和安全性。 如果您想知道您的网络中发生了什么&#xff0c;以便洞察潜在的…

【JUC】线程池ThreadPoolTaskExecutor与面试题解读

1、ThreadPoolTaskExecutor 创建线程池 从它的创建和使用说起&#xff0c;创建和使用的代码如下&#xff1a; 创建&#xff1a; ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize…

Java之继承详解二

3.7 方法重写 3.7.1 概念 方法重写 &#xff1a;子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 3.7.2 使用场景与案例…

Spring复习:(55)ApplicationContext中BeanFactoryPostProcessor是怎么添加到容器的?

容器创建时会调用AbstractApplicationContext的refresh方法&#xff0c;其中会调用invokeBeanFactoryPostProcessor方法&#xff0c;如下图 invokeBeanFactoryPostProcessors代码如下&#xff1a; 其中调用的PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcess…

计算机竞赛 交通目标检测-行人车辆检测流量计数 - 计算机竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

【Flutter】Flutter 使用 font_awesome_flutter 展示图标

【Flutter】Flutter 使用 font_awesome_flutter 展示图标 文章目录 一、前言二、安装和基本使用1. 安装2. 基本使用示例3. 图标的命名和样式 三、自定义图标和高级功能1.动态检索图标2.排除样式和优化 四、完整示例五、总结 一、前言 在现代移动应用开发中&#xff0c;图标起着…

C语言入门 Day_8数据与运算小结

目录 前言 1.精度 2.运算 2.易错点 3.思维导图 前言 到目前为止我们一共学习了四种数据类型&#xff0c;他们分别是表示整数的整型&#xff1b;表示小数的浮点型&#xff1b;表示字符的字符型&#xff1b;和表示布尔数的布尔型。 表示整数的整型&#xff0c;它的变量类型名…

浅谈泛在电力物联网在电力设备状态在线监测中的应用

安科瑞 华楠 摘要&#xff1a;随着信息化水平的不断发展&#xff0c;泛在电力物联网的建设提上日程&#xff0c;这对提升变电站电力设备在线监测水平&#xff0c;推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究&#xff0c;概括了泛在电力…

Android TV开发之VerticalGridView

Android TV应用开发和手机应用开发是一样的&#xff0c;只是多了焦点控制&#xff0c;即选中变色。 androidx.leanback.widget.VerticalGridView 继承 BaseGridView &#xff0c; BaseGridView 继承 RecyclerView 。 所以 VerticalGridView 就是 RecyclerView &#xff0c;使…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

重生之我要学C++第六天(const,static,友元)

这篇文章的主要内容是const以及权限问题、static关键字、友元函数和友元类&#xff0c;希望对大家有所帮助&#xff0c;点赞收藏评论支持一下吧&#xff01; 更多优质内容跳转&#xff1a; 专栏&#xff1a;重生之C启程(文章平均质量分93) 目录 const以及权限问题 1.const修饰…

【计算机网络】【常考问题总结】

1. ping 127.0.0.1 后会发生什么&#xff1f; ping 127.0.0.1 &#xff1b;ping 0.0.0.0 &#xff1b; ping localhost 面试官问&#xff1a;断网了&#xff0c;还能ping通 127.0.0.1 吗&#xff1f;为什么&#xff1f;_kevin_tech的博客-CSDN博客 2. MTU&#xff0c;MMU是…

新书上市----Pytest企业级应用实战 新书上市

【原文链接】新书上市----Pytest企业级应用实战 新书上市 《Pytest企业级应用实战》 京东购书链接 当当购书链接 天猫购书链接 作者简介 本书作者本硕毕业于哈尔滨工业大学&#xff0c;曾先后就职于中兴通讯和华为&#xff0c;现任职于中科南京软件技术研究院&#xff0c;…

(三)行为型模式:3、解释器模式(Interpreter Pattern)(C++示例)

目录 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 2、解释器模式的UML图学习 3、解释器模式的应用场景 4、解释器模式的优缺点 5、C实现解释器模式的实例 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 解释器模式&#xff08;Interp…

python分析实战(4)--获取某音热榜

1. 分析需求 打开某音热搜&#xff0c;选择需要获取的热榜如图 查找包含热搜内容的接口返回如图 将url地址保存 2. 开发 定义请求头 headers {Cookie: 自己的cookie,Accept: application/json, text/plain, */*,Accept-Encoding: gzip, deflate,Host: www.douyin.com,…

陕西科技大学改考408!附考情分析

改考信息 8月14日&#xff0c;陕西科技大学公布了2024年硕士研究生招生目录&#xff08;初稿&#xff09;&#xff0c;其中不难发现083500软件工程初试专业课由819数据结构改为408计算机学科专业基础 图片&#xff1a;陕西科技大学24专业目录-软件工程学硕 https://yjszs.sus…

优化指南:带宽限制的可行策略

大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我们经常面临的一个挑战就是带宽限制。尤其是在需要快速采集大量数据时&#xff0c;带宽限制成为了我们提升爬虫速度的一大阻碍。今天&#xff0c;我将和大家分享一些解决带宽限制的可行策略&#xff0c;希望能帮助大家…