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就成功了