K8s+Docker+KubeSphere+DevOps笔记

K8s+Docker+KubeSphere+DevOps


前言

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


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

一、阿里云服务器开通

云服务器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基础命令操作

c 复制代码
#容器运行命令
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:tagname

docker 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中间件

c 复制代码
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后面的命令取代,并作为参数

微服务

c 复制代码
#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"]
c 复制代码
# docker构建镜像
docker build  -t  java-daemon:v1.0 -f ./DockerFile
c 复制代码
#运行容器
docker run  -d -p 8080:8080  \
-v  /data/app-java/app.yml:/app.yml
 --name myjava java-daemon:v1.0
c 复制代码
#推送到远程仓库
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"
}
EOF

systemctl  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/config

sed -i 's/^SELINUX=disabled$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

systemctl disable firewalld.service --now
systemctl disable NetworkManager --now
ntp时间同步
 rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm


ntpdate time2.aliyun.com
crontab -e
*/5 * * * * ntpdate time2.aliyun.com

/etc/rc.local
ntpdate time2.aliyun.com


 ulimit -SHn 65535



#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF




cat <<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
EOF


sysctl --system
 sysctl -p /etc/sysctl.d/k8s.conf


timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0
 

systemctl restart rsyslog crond
systemctl stop postfix && systemctl disable postfix
css 复制代码
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 -y

yum 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 配置

css 复制代码
 grep -E -v  "^*#|^$" /etc/haproxy/haproxy.cfg 
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
frontend  main  *:16443
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    use_backend  k8s-master          if url_static
    default_backend             k8s-master
listen stats 
    bind   *:8006
    mode   http
    stats  enable
    stats  hide-version
    stats  uri   /stats
    stats  refresh  30s 
    stats  realm   Haproxy\ statistics
    stats  auth  admin:P@ssword
backend k8s-master
    balance     roundrobin
    server      k8s-master-01 192.168.220.128:6443 check
    server      k8s-master-02 192.168.220.129:6443 check
    server      k8s-master-03 192.168.220.130:6443 check

keepalived 配置

css 复制代码
[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_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51 ##主备相同
    priority 100  ##权重逐级减小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 10086
    }
    virtual_ipaddress {  
        192.168.200.100   ##vip
    }
}

2、k8s初始化master节点:

css 复制代码
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).

##镜像下载:

css 复制代码
##无魔法上网下载镜像
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
do
    docker pull $i
done
EOF

##镜像上传

css 复制代码
## 上传到自己的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
do
	for im in $images_target 
	do
		docker tag $i $im
		docker push $im
	done
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
EOF



yum install -y kubelet kubeadm kubectl

cat  /etc/profile
#export DOCKER_CGROUP=$(docker info | grep "Cgroup D" | cut -d ' '  -f4)
export DOCKER_CGROUP=systemd

systemctl 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
--cri-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.yaml

apiVersion: 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 #容器运行时的socket
  name: k8s-master01 #节点名称
  taints: #节点容忍设置
  - effect: NoSchedule #不允许在该节点上调度新的Pod
    key: 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.service

github提供的镜像加速,下载github东西用这个前缀可以
https://ghproxy.com/
css 复制代码
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"

css 复制代码
 kubelet --config=/etc/kubernetes/kubelet.conf --container-runtime=remote --container-runtime-endpoint=unix:///var/run/docker.sock
css 复制代码
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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:
##root用户
  export KUBECONFIG=/etc/kubernetes/admin.conf

You 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 -O

kubectl 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-dashboard

type: 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-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: 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: myapp
  name: myapp
  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx
  - image: redis
    name: 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:

css 复制代码
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生成指定镜像

css 复制代码
docker build -t name:version -f Dockerfile  .

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

css 复制代码
docker login

docker tag 

docker push

docker 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


相关推荐
运维小文36 分钟前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻37 分钟前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge9 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX10 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总10 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿11 小时前
k8s 集群安装
云原生·容器·kubernetes
意疏11 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
墨鸦_Cormorant11 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker
Code_Artist11 小时前
Docker镜像加速解决方案:配置HTTP代理,让Docker学会科学上网!
docker·云原生·容器
颜淡慕潇13 小时前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes