k8s-基础篇

搭建k8s环境

Myapp镜像部署
扩容pod
自愈
负载均衡
DNS
外网访问
滚动更新
YAML方式部署
独立部署pod
RS副本控制器
Deployment-自动扩容
Deployment-更新版本
Deployment-回滚版本
daemonset
job
cronJob
初始化容器

链接:https://pan.baidu.com/s/1U_AWBEXsjESZ2eDPIH4TFA
提取码:gmze

网盘里有一些配置文件和系统组件可以自行下载使用。环境搭建很麻烦,如果发现失败可与我联系或按照文档重试几次。以下步骤是完全可用的!

搭建k8s环境

环境准备

环境3台centos虚拟机每台虚拟机2核2G,一个master两个node。搭建k8s环境如没有特殊说明所有操作均在三个节点同时操作。

#1、给每一台机器设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#查看主机名
hostname
#配置IP host映射关系
vi /etc/hosts
192.168.66.10 k8s-master01
192.168.66.11 k8s-node01
192.168.66.12 k8s-node02
#2、安装依赖环境,注意:每一台机器都需要安装此依赖环境
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge- utils unzip bind-utils gcc
#3、安装iptables,启动iptables,设置开机自启,清空iptables规则,保存当前规则到默认规则
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 置空iptables
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
#4、关闭selinux
#闭swap分区【虚拟内存】并且永久关闭虚拟内存
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
 
#5、调整内核参数,对于k8s
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
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
#将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf
 
#6、调整系统临时区 --- 如果已经设置时区,可略过
#设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
#7、关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
#8、设置日志保存方式
#1).创建保存日志的目录
mkdir /var/log/journal
#2).创建配置文件存放目录
mkdir /etc/systemd/journald.conf.d
#3).创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
#4).重启systemd journald的配置
systemctl restart systemd-journald
 
#9、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
##使用lsmod命令查看这些文件是否被引导
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

部署docker

curl -sSL https://get.daocloud.io/docker | sh
systemctl enable docker && systemctl start docker

kubeadm[一键安装k8s]

#1、安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是
packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜像。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#2、安装kubeadm、kubelet、kubectl
yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
# 启动 kubelet
systemctl enable kubelet && systemctl start kubelet

集群安装

网盘中有镜像文件kubeadm-basic.images

#1、导入镜像脚本代码 (在任意目录下创建sh脚本文件:image-load.sh)
#!/bin/bash
#注意 镜像解压的目录位置
ls /root/kubeadm-basic.images > /tmp/images-list.txt
cd /root/kubeadm-basic.images
for i in $(cat /tmp/images-list.txt)
do
docker load -i $i
done
rm -rf /tmp/images-list.txt
#2、修改权限,可执行权限
chmod 755 image-load.sh
#3、开始执行,镜像导入
./image-load.sh

k8s部署 

#初始化主节点 --- 只需要在主节点执行
#1、拉去yaml资源配置文件
kubeadm config print init-defaults > kubeadm-config.yaml 
#2、修改yaml资源文件
localAPIEndpoint:
advertiseAddress: 192.168.66.10 # 注意:修改配置文件的IP地址
kubernetesVersion: v1.15.1 #注意:修改版本号,必须和kubectl版本保持一致
networking:
# 指定flannel模型通信 pod网段地址,此网段和flannel网段一致
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
#3、初始化主节点,开始部署
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
1.19命令
kubeadm init --kubernetes-version=v1.19.0  --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.180.132
#注意:执行此命令,CPU核心数量必须大于1核,否则无法执行成功
#4、初始化成功后执行如下命令
#创建目录,保存连接配置缓存,认证文件
mkdir -p $HOME/.kube
#拷贝集群管理配置文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#授权给配置文件
chown $(id -u):$(id -g) $HOME/.kube/config 

flflannel插件

#部署flannel网络插件 --- 只需要在主节点执行
#1、下载flannel网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#2、部署flannel
kubectl create -f kube-flannel.yml 

节点Join

节点加入需要token和sha256,在主节点上执行以下命令获取。

创建token

kubeadm token create

m9rrtc.2cm48k5w6ymsprwt

查看token可能有多个,选择一个没有过期的即可

kubeadm token list 

获取 CA 证书 sha256 编码 hash 值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

4a77cfd6f9e2a16a7a45351369275f102b9986b469d3f9f9865a87050e4bf0dc

在子节点执行以下命令

kubeadm join 主机IP:6443 --token 59mzkj.26xap2hzdhm74ptq --discovery-token-ca-cert-hash sha256:18acdb7c02c6ea696307fde451f44ea0d216e6ccb6777a2a87002d7d45f3845c

在主节点查看。我这里node2虚拟机关闭了,电脑不行。正常情况下都是Ready

 
注意:如果master或node节点的ip变化了。
kubeadm reset 重置节点
master则重复k8s部署和flflannel插件两个步骤。
node则重复节点join步骤

Myapp镜像部署

需要在master和node上配置docker镜像。

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors?accounttraceid=0cd89c7411274ee48cb11fad06368ba3fxyw

创建pod(部署服务) : kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=2 (replicas指定pod数量默认1)

查询pod创建详细信息: kubectl describe pod myapp-554864fdf4-f4gw9

查询pod: kubectl get pod

查询pod详细信息: kubectl get pod -o 

Kubectl run 首先创建deployment对象,kubectl run 指令执行后创建了3个资源对象(deployment,rs,pod)

注意: 上面这条指令没有指定副本数量,默认创建了1个pod。如果只有master节点则创建失败,至少有一个node

如果要删除彻底删除pod需要先删除deployment,然后pod会自动删除。

kubectl delete deployment myapp

扩容pod

kubectl scale deployment myapp --replicas=4

也可以再次缩容

自愈

K8s管理的pod不仅仅可以一键式部署,一键式扩容,同时k8s管理的pod还具有自愈能力。也就是说当pod发生故障,宕机,k8s将会自动对pod件重建,因此k8s的pod的副本永远处于高可用状态。

删除所有的pod,查看pod是否还存在: kubectl delete pod –all

负载均衡

Pod有多个副本,访问pod副本必须实现负载均衡访问,那么这个负载均衡访问是通过service来实现的。因此对一组pod副本创建一个service,进行负载均衡

对一组pod副本创建service: kubectl expose deployment myapp --port=30000 --target-port=80

kubectl get svc

通过测试发现,k8s默认使用轮训策略。

kubectl delete svc/myapp 删除service

DNS

安装k8s时候,安装dns组件,dns(域名解析服务器,根据域名解析出真实ip地址,通过dns可以通过服务名进行相互的访问)

在容器内部通过服务名访问其他容器

kubectl exec -it myapp-554864fdf4-wsr7h -- sh

wget myapp:30000(service名称) --- 测试通过,说明可以通过服务名称,访问到外部网络,因此dns服务器是ok的。

外网访问

Service 和pod 之间的通信都属于局域网通信访问。无法对外网直接提供服务,service是一个虚拟化的概念,是一个虚拟IP地址,没有与之对应的物理硬件资料,无法直接对外网提供服务,必须借助于物理硬件资源进行数据包转发。

kubectl edit svc myapp  --- 编辑service对应资源对象配置文件,通过修改ip类型,来绑定物理端口。

可以发现32727就是我们所开辟物理端口,此端口可以在配置文件中自定义,也可以默认即可,默认端口范围:30000 – 32767

滚动更新

项目迭代,不停的发布新的版本,如何实现不停机更新。一键式更新操作.滚动更新,发现访问时候,已经是v2版本的服务.原来的pod开始没有关闭

等到新版本的pod发布后才把老版本删除。

YAML方式部署

通过yaml配置文件方式一键部署服务。yaml的详细配置在网盘连接里有。YAML语法规范.md

现在我们要部署一个Nginx服务,先拉去一个docker镜像,其实可以让k8s自己下载,但是我要给Nginx打一个tag 

docker pull nginx

编写yaml文件在网盘链接中有

apiVersion: apps/v1 
kind: Deployment 
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
      release: stable
      env: test
  template:
    metadata:
      labels:
        app: mynginx
        release: stable
        env: test
    spec:
      containers:
      - name: my-nginx
        image: nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
View Code

kubectl apply -f nginx-deploy.yaml 执行脚本

编写service.yaml

apiVersion: v1 
kind: Service
metadata:
   name: nginx-svc
   namespace: default
spec:
   type: NodePort
   selector:
     app: mynginx
     release: stable
     env: test
   ports:
   - name: http
     port: 80
     targetPort: 80
     nodePort: 30003
View Code

独立部署pod

自主式的pod: 单独定义一个pod,这个没有没有副本控制器管理,也没有对应deployment,可以直接删除pod并且不会自愈。

apiVersion: v1
kind: Pod
metadata:
 name: init-pod
 labels:
   app: myapp
spec:
 containers:
 - name: myapp
   image: ikubernetes/myapp:v1
View Code

kubectl apply -f init-pod.yaml 执行脚本

RS副本控制器

ReplicationController (RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收;

在新版本的Kubernetes中建议使用Replicaset来取代ReplicationController. ReplicaSet跟 ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector;

apiVersion: extensions/v1beta1 
kind: ReplicaSet 
metadata:
  name: frontend 
spec:
  replicas: 3
  selector:
    matchLabels: 
      tier: frontend 
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
        - name: myapp
          image: ikubernetes/myapp:v1
View Code

pod删除后可以自愈

修改pod的标签后pod就会脱离RS而RS也会重新生成一个pod

删除副本控制器后pod也会删除

Deployment-自动扩容

Deployment可以保证在升级时只有一定数量的Pod是down的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)

Deployment同时也可以确保只创建出超过期望数量的一定数量的Pod,默认的,它会确保最多比期望的Pod数量多一个的Pod是up的(最多1个surge )

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata:
  name: nginx-deployment 
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers: 
        - name: myapp
          image: ikubernetes/myapp:v1
View Code

kubectl autoscale deployment nginx-deployment --min=2 --max=5 --cpu-percent=80

这条指令是说最少两个pod最多5个单个pod的cpu使用率达到80则创建副本。

Deployment-更新版本

kubectl set image deployment appdeployment(deployment名称) nginx(container名称)=ikubernetes/myapp:v2(要更新的镜像) 

Deployment-回滚版本

kubectl rollout undo deployment appdeployment(deployment名称)

daemonset

确保只运行一个副本,运行在集群中每一个节点上。而deployment可能只将pod运行在一个节点上。daemonset没有RS

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-deamon
  namespace: default
  labels: 
    app: daemonset
spec:
  selector:
    matchLabels:
      app: my-daemonset
  template:
    metadata:
      labels:
        app: my-daemonset
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
View Code

job

job负责处理任务,即仅执行一次的任务,下面这个job从仓库拉去一个镜像,执行一个循环打印。

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
View Code

cronJob

cronJob其实就是在`Job`的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。

以下配置是1分钟创建一个job执行

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: hello
            image: busybox
            args:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
View Code

初始化容器

Pod能够持有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。Init容器与普通的容器非常像,除了如下两点:1 Init容器总是运行到成功完成为止 2 每个Init容器都必须在下一个Init容器启动之前成功完成

如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止。然而,如果Pod对应的restartPolicy为Never,它不会重新启动。

以下配置为初始化容器休眠2分钟后创建。然后应用容器才会创建

apiVersion: v1
kind: Pod
metadata:
 name: init-pod
 labels:
   app: myapp
spec:
 containers:
 - name: myapp
   image: nginx
 initContainers:
 - name: init-mydb
   image: nginx
   command: ['sh', '-c', 'echo -n "running at " && date +%T && sleep 120']
View Code

 

posted @ 2022-02-05 18:34  顶风少年  阅读(354)  评论(0编辑  收藏  举报
返回顶部