Kubernetes基础入门和安装

Kubernetes基础入门

k8s参考网站

官网:TP

官方文档:TP

官方介绍:TP

kubeadm官方文档:TP

docker官方文档:TP

prometheus官方文档:TP

ansible安装k8s项目:TP

阿里云ACK:[TP]

容器时代优势

容器因具有许多优势而变得流行起来,例如:

敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
资源隔离:可预测的应用程序性能。
资源利用:高效率和高密度。

k8s优点

	# 服务发现和负载均衡

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

	# 存储编排

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

	# 自动部署和回滚

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

	# 自动完成装箱计算

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

	# 自我修复

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

	# 密钥与配置管理

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

K8s组件

Master:control plane components 控制平面组件  服务端
	apiserver:司令部,接收所有组件传递的命令接口
	scheduler:调度器,资源计算
	controller:控制器,控制客户端(kubelet)在所有宿主机上创建容器
	etcd:老祖宗,存放所有组件产生的数据
Node:客户端
	kubelet:创建pod(容器)
	kube-proxy:提供容器之间的网络
	container runtime:容器运行时,docker、containerd....

Master

Node

K8s库主机通信

ũannel,不使用防火墙,IPVS:ipvsadm
LVS:负载均衡,ipvsadm 修改网络参数

K8S架构

K8S核心资源

POD

1、Pod是K8S的最小单位
2、Pod的IP地址是随机的,删除Pod会改变IP
3、Pod都有一个根容器
4、一个Pod内可以由一个容器或多个容器组成
5、一个Pod内的容器共享根容器的网络、名称空间、和文件系统卷
6、一个Pod内的网络地址由根容器提供

pod的运行状态

状态 描述
Pending(等待) Pod已经被K8S系统接受,但是有一个或多个容器,尚未创建,亦未运行。此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间
Running(运行) Pod已经绑定到某个节点(node),Pod中所有容器都已被创建,至少有一个容器仍在运行,或者处于启动或重启状态
Succeeded(成功) Pod中所有容器都已成功终止,并且不会再重启
Failed(失败) Pod中所有容器都已成功终止,并且有一个容器是因为失败而终止
Unknown(未知) 因为某些原因无法获取Pod状态,这种情况,通常是因为与Pod所在主机通信失败

service

Service也是K8S核心资源之一,Service定义了服务的入口地址,用来将后端的Pod服务暴露给外部的用户访问

service的三种网络模式

Nodeport:10.0.0.41:80
ClusterIP:10.1.0.10:80  会变化
POD IP:容器IP 10.2.0.10:80  会变化 

Label

Label标签是K8S中非常重要的一个属性,Label标签就像身份证一样,可以用来识别K8S的对象。
传统架构中,不同的服务应用之间通讯,都是通过IP和端口,但是在K8S中很多匹配关系都是通过标签来找。

Namespace

Namespace(名称空间)是K8S中非常重要的一个概念,Namespace将集群内部的资源进行隔离划分。 在Namespace中,形成逻辑上的不同项目组或用户组。

Controller

Controller用来管理Pod。
Pod控制器的种类有很多:
- RC Replication Controller 控制Pod有多个副本
- RS ReplicaSet  RC控制器的升级版
- Deployment    推荐使用,功能强大,包含了RS控制器
- DaemonSet     保证所有的Node节点上,有且只有一个Pod运行
- StatefulSet       有状态的应用,为Pod提供唯一标识,它可以保证部署和scale的顺序

Pod RC Service的关系

K8s部署

环境准备

主机名 IP 角色 配置推荐 安装软件
backup 10.0.0.41 master 1C4G20G kubeadm、API Server、Controller、Scheduler、Kube-proxy、Kubelet、etcd、Docker、kube-ctl
docker 10.0.0.72 node1 1C2G20G kubeadm、Docker、Kubelet、Kube-proxy
docker02 10.0.0.75 node2 1C2G20G kubeadm、Docker、Kubelet、Kube-proxy

IP规划

三种Service IP
Pod IP 10.2.0.0
Cluster IP 10.1.0.0
Node IP 10.0.0.0

安装方式

## K8S的方式有一堆
二进制安装   不推荐
kubeadm     官方推荐
网友写的Ansible二进制安装  非常牛逼~~~
第三方安装工具  Rancher    我上家公司使用的方式
云服务的K8S安装 阿里云ACK8

先决条件(所有节点)

1.禁用swap分区
cat >/etc/sysconfig/kubelet <<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
2.优化内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
3.检查是否配置成功
[root@backup ~]# sysctl  --system
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...
net.ipv4.ip_forward = 1 
4.做hosts解析
cat >> /etc/hosts << EOF
10.0.0.41 master
10.0.0.72 node1
10.0.0.75 node2
EOF
5.配置阿里云的源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
6.时间同步
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
7.关闭swap分区
swapoff -a
sed -i '/swap/d' /etc/fstab
8.加载IPVS模块
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 +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod|grep -e 'ip_vs' -e 'nf_conntrack_ipv'
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  4 
ip_vs                 145497  10 ip_vs_rr,ip_vs_sh,ip_vs_wrr

9.卸载之前的docker
systemctl stop docker 
yum remove docker-ce -y
10.查看不同版本的docker
yum list docker-ce --showduplicates
11.安装指定版本的docker
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15
12.修改docker配置文件
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<  EOF
{
  "registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
13.启动docker并加入开机自启
systemctl start docker
systemctl enable docker
14.安装kubeadm
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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
15.安装kubeadm
yum install kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm -y
16.启动kubelet
systemctl enable kubelet
systemctl start kubelet

Master节点操作

1.集群初始化
kubeadm init \
--apiserver-advertise-address=10.0.0.41 \
--image-repository registry.aliyuncs.com/google_containers  \
--kubernetes-version=v1.19.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU

### 如果初始化错误,需要重复执行初始化时,执行该命令
kubeadm reset

2.初始完成后,保留初始化的最后信息

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.0.41:6443 --token p18tfm.wmpf49g06j00fnxe \
    --discovery-token-ca-cert-hash sha256:bd38075a44b228575d989a250a9ee7b3a297547fc4bf7f99d0f457da20913206 
3.执行保留的信息
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.查看所有的nodes,查看所有k8s节点
[root@backup ~]# kubectl get nodes 
NAME       STATUS   ROLES    AGE   VERSION
backup     Ready    master   79m   v1.19.3

Node节点操作

1.将node节点加入k8s集群
kubeadm join 10.0.0.41:6443 --token p18tfm.wmpf49g06j00fnxe \    --discovery-token-ca-cert-hash sha256:bd38075a44b228575d989a250a9ee7b3a297547fc4bf7f99d0f457da20913206 

Master节点配置flannel网络

1.修改转发配置,不使用iptables,使用ipvs
[root@backup ~]# kubectl edit cm kube-proxy -n kube-system
     44     mode: "ipvs"
   	 # 将mode:"" 改为 mode:"ipvs"
2.删除pod重新起新pod
kubectl -n kube-system get pod|grep kube-proxy|awk '{print "kubectl -n kube-system delete pod "$1}'|bash

Master操作

1.打标签
语法:
	kubectl label nodes node1 node-role.kubernetes.io/node=
	kubectl label nodes <节点名称> node-role.kubernetes.io/<标签名称>=

kubectl label nodes docker node-role.kubernetes.io/node1
kubectl label nodes docker02 node-role.kubernetes.io/node2=

### 删除标签操作
语法:
	kubectl label nodes node1 node-role.kubernetes.io/node-
	kubectl label nodes <节点名称> node-role.kubernetes.io/<标签名称>-
2.Master节点重新生成,node节点加入集群
kubeadm token create --print-join-command
3.使用falnnel
	1.github下载flannel代码仓库
	git clone --depth 1 https://github.com/coreos/flannel.git
	2.找到kube-flannel.yml文件
	cd /root/flannel/Documentation/
	3.编辑文件
	vim kube-flannel.yml
	 84       "Network": "10.2.0.0/16",
	 150       containers:
	 151       - name: kube-flannel
	 152        #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
	 153         image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
	 154         command:
	 155         - /opt/bin/flanneld
	 156         args:
	 157         - --ip-masq
	 158         - --kube-subnet-mgr
	 159         - --iface=eth0
4.使配置生效
kubectl apply -f kube-flannel.yml
### kube命令补全
	yum install -y bash-completion
	source /usr/share/bash-completion/bash_completion 
	source <(kubectl completion bash) 
	kubectl completion bash > /etc/bash_completion.d/kubectl
5.查看falnnel
[root@backup ~]# kubectl get pods -n kube-flannel -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP          NODE       NOMINATED NODE   READINESS GATES
kube-flannel-ds-7j8qj   1/1     Running   0          86m   10.0.0.72   docker     <none>           <none>
kube-flannel-ds-hdpxt   1/1     Running   0          86m   10.0.0.75   docker02   <none>           <none>
kube-flannel-ds-lt9cs   1/1     Running   0          86m   10.0.0.41   backup     <none>           <none>
# 是Running就成功了
posted on 2022-09-18 18:48  jilei  阅读(32)  评论(1编辑  收藏  举报