1.K8s(kubernetes)基础特性

1.1服务发现和负载均衡

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

1.2存储编排

k8s允许你自动挂载你的存储系统,例如本地存储,公共云提供等

1.3自动部署和回滚

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

1.4自动完成装箱计算

        Kubernetes 允许你指定每个容器所需CPU和内存(RAM)。当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源。

1.5自我修复

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

1.6密钥与配置管理

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

2.k8s架构

1.工作方式

通过集群的方式进行工作

Kubernetes Cluster = N Master Node+ N Worker Node: N主节点+N工作节点; N>=1
高可用集群:master节点挂了,其余的节点会进行选举出master主节点。
搭建k8s集群
1.master节点和工作节点都要安装docker环境,k8s只是一个容器编排工具,需要提供docker容器环境。
为了使用方便可以手动设置主机名:set-hostname k8s-master(设置一次永久生效)
内网互信:禁用交换分区。为了保证kubelet正常工作,你必须禁用交换分区
 
 
#各个机器设置自己的域名
hostnamectl set -hostname xxXx
#将SELinux 设置为permissive 模式(相当于将其禁用)
sudo setenforce 日
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap. */#&/' /etc/fstab

#允许iptables"检 查桥接流量 k8s官方要求的
cat <<EOF| sudo tee /etc/modules- load . d/k8s. conf
br_ netfilter
EOF
cat <<EOF| sudo tee /etc/sysct1.d/k8s. conf
net. bridge . bridge-nf-call-ip6tables = 1
net . bridge. bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
2.安装kubelet,kubeadm,kubectl
#k8s去哪里下载的地址
cat << EOF | sudo tee /etc/yum. repos . d/kubernetes . repo
[kubernetes]
name= Kubernetes
baseurl=http://mirrors。aliyun. com/ kubernetes/yum/repos/kubernetes-e17-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
exclude=kubelet kubeadm kubectl
EOF

# 安装三大件
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubect1-1.20.9 --
disableexcludes=kubernetes
# 立刻启动kubelet
sudo systemctl enable hs-now kubelet
#查看 kubelet状态
systemd status kubelet  #发现一会运行一会停止 在监控
2.使用kubeadm引导集群
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube- controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pu1l registry.cn-hangzhou. aliyuncs. com/1fy_ k8s_ images/$imageName
done
EOF

#chmod +x  给这个文件赋予权限 并执行
chmod +x ./images.sh && ./images.sh
2.初始化主节点
#所有机器添加master城名映射(10.140.122.4IP地址是master内网地址 cluster-endpoint是域名 所有节点执行这条命令 如果能ping通主节点证明成功)
echo "10.140.122.4 cluster-endpoint" 》> /etc/hosts

#主节点执行下面的命令
#主节点初始化(注意:下面的ip是masterip,域名要和上面配置的一致 cluster-endpoint)
kubeadm init \
--apiserver-advertise-address=10.140.122.4 \
--control-plane -endpoint=cluster-endpoint \
-- image-repository registry . cn-hangzhou. aliyuncs.com/1fy_ k8s_ images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

注意:所有网络范围不重叠不能与master重叠(所以不要改)
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

192.168.0.0/16所有的pod应用分配的ip都是在这个范围。集群中的任意一个机器以及应用都能通过pod分配的ip来访问这个(集群内,外网不行 需要暴露端口的方式)
3.补充知识
kubectl get node  #获取所有节点信息

#令牌过期可以使用下面的命令重新生成 (加入节点)
kubectl token create --print-join-command  #生成新的令牌
 
 
4.安装可视化界面dashboa
 
 
kubect1 apply -f
https://raw. githubusercontent.com/ kubernetes/dashboard/v2.3.1/aio/dep1oy/recommended.yaml

#手动下载资源(github国外网站)
wget  https://raw. githubusercontent.com/ kubernetes/dashboard/v2.3.1/aio/dep1oy/recommended.yaml
kubectl apply -f recommended.yaml

vi dashboard.yaml  #创建文件并生成

#设置端口:
kubectl edit svc kubernetes-dashboard -n kubernetes -dashboard
type: ClusterlP改玉type: NodePort  #暴露端口
kubectl get svc -A| grep kubernetes - dashboard
#找到端口,在安全组放行
4.重要概念:
pod ->运行中的应用叫做pod
#获取命名空间
kubectl get ns(namespace)
#创建命名空间
kubectl create ns hello
#删除命名空间
kubectl delete ns hello
默认的命名空间不能删除,可以删除自己创建的命名空间

文件的方式创建
apiVersion: v1
kind: Namespace
metadata:
    name:hello
kubectl -f apply *.yaml
5.pod的相关概念(k8s中运行的应用叫做pod)
运行中的一组容器,Pod是k8s中应用的最小单位,(一个pod可以部署多个容器,但是一个pod推荐只安装一个容器)

容器化运行环境(CRI: Container Runtime Interface)

创建pod
kubctl run mynginx --image=nginx #(mynginx是起个名字 --image=nginx镜像 pod里面是容器,这个容器是nginx)
#查看default 名称空间的pod 
kubectl get pod
#查看所有的pod
kubectl get pod -a
#查看pod描述(k8s集群排错)
kubctl describe pod  你自己的pod的名字
#删除pod
kubctl delete pod  pod名字
#查看pod的运行日志
kubctl logs pod名字

#每个pod -k8s都会分配一个ip(看到每个pod的信息)
kubectl get pod -owide
#使用pod的ip+pod里面运行容器的端口就可以访问到
例如pod的nginx的容器:curl ip:端口(curl 192.168.169.136:80)

#进到pod的容器里面
kubctl exec -it mynginx -- /bin/bash


5.1多容器的pod
每一个pod都会有一个唯一IP进行访问
创建多个容器 :里面的name不能一样
 
 
apiVersion: v1 #版本
kind: Pod  #pod
metadata :
  labels: #标签
    run: myapp
  name: myapp  #pod的名称
#容器详情 每一个image前面用 "-"多个也是这样
spec: 
  containers:
    - image: nginx  #nginx镜像 最新版本
      name: nginx   #nginx名字
    - image: tomcat:8.5.68  # tomcat:8.5.68 镜像tomcat:8.5.68指定版本
      name: tomcat  #tomcat名字
 
 
Restarts : pod重启几次了
6.Deployment
#自愈能力(nginx启动3个 多副本(多节点))
kubectl create deployment my-deploy --image=nginx replicas=3
kubectl get deploy  # 获取deployment
kubectl  delete deploy my-deploy

扩缩容( scale)
kubectl scale --replicas=5 deployment/my-deploy
#监控(1s打印一次)
watch -n 1 kubectl get pod

也可以通过修改yaml文件
kubectl edit deploy my-deploy
#查看这些机器都部署在哪台机器
kubectl get pod -owide
可以手动设置自愈的时间

#Deployment 滚动更新(灰度上线)
kubectl set image deployment/my-deploy nginx=nginx:1.16.1 --record

#版本回退
kubectl rollout history deployment/my-deploy  #查看所有发布的版本
kubectl rollout undo deploy/my-deploy --to-revision=1 #回到版本1
重点基础知识:
Deployment:无状态应用部署,比如微服务,提供多副本等功能
StatefulSet:有状态应用部署 ,比如redis,提供稳定的存储、网络等功能
DaemonSet:守护型应用部署,比如日志收集组件,在每个机器都运行一份
Job/CronJob:定时任务部署,比如垃圾清理组件, 可以在指定时间运行
3.服务发现:
# 集群内部访问
kubectl expose deploy my-deploy --port=8000 --target-port=80 --type=ClusterIP

# 集群外部也可以访问(外网也可以)
kubectl expose deploy my-deploy --port=8000 -- target-port=80 --type=NodePort


Ingress网关(本质上是一个nginx) https http