文章目录
一、K8s快速入门
1. 简介
kubernetes简称k8s。是用于自动部署、可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
中文官网:https://kubernetes.io/Zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:https://docs.kubernetes.org.cn/
部署方式的进化:
2. 架构
文档:https://kubernetes.io/zh/docs/concepts/overview/components/
1)master节点架构
-
kube-apiserver
-
etcd
-
- 主节点上的组件,负责监视新创建的、未指定运行节点(node)的 Pods,并选择节点让 Pod 在上面运行。
- 对所有 k8s 集群的操作,都必须经过主节点进行调度
-
kube-controller-manager
:在主节点上运行控制器进程的组件这些控制器包括:
2)Node节点架构
-
kubelet
-
kube-proxy
- kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
- kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
-
容器运行时(Container Runtime)
- 容器运行环境是负责运行容器的软件。
- Kubernetes 支持多个容器运行环境:Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
-
fluentd
- 是一个守护进程,它有助于提供集群层面日志
3. 概念
-
Container
:容器,可以是 docker 启动的一个容器 -
Pod
:
- k8s 使用 Pod 来组织一组容器
- 一个 Pod 中的所有容器共享同一网络。
- Pod 是 k8s 中的最小部署单元
-
Volume
: -
Controllers
:更高层次对象,部署和管理Pod;- replicaset:确保预期的 Pod 副本数量
- Deplotment:无状态应用部署
- StatefulSet:有状态应用部署,例如 MysqL
- DaemonSet:确保所有Node都运行一个指定Pod
- Job:一次性任务
- Cronjob:定时任务
-
Deployment
: -
Service
-
Namespace
:命名空间,逻辑隔离 -
API:我们通过 kubernetes 的 API 来操作整个集群。
- 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给 API Server,然后控制 k8s 集群。k8s 里的所有的资源对象都可以采用
yaml
或JSON
格式的文件定义或描述
- 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给 API Server,然后控制 k8s 集群。k8s 里的所有的资源对象都可以采用
二、K8s集群安装
1. 前置要求
- 准备一台或多台机器,操作系统 Centos7.x-86_x64。我的配置 3 台 Centos7
- 硬件配置:2GB或更多RAM,2个cpu或更多cpu,硬盘30GB或更多。我的配置 2核 2G 64G
- 集群中所有的机器之间网络互通
- 可以访问外网,需要拉取镜像
2. 配置Linux环境(所有节点都执行)
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
-
关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0
-
关闭swap
swapoff -a #临时关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭 free -g #验证,swap必须为0
-
添加主机名与IP对应关系:
查看主机名:
hostname
如果主机名不正确,可以通过
hostnamectl set-hostname <newhostname>
命令来指定新的hostname
。我的三台节点名:k8s-node1,k8s-node2,k8s-node3在三台机器中配置
/etc/hosts
以便可以互相通过hostname
访问vim /etc/hosts 10.211.55.19 k8s-node1 # 这里的IP要修改成hostname对应节点的IP 10.211.55.21 k8s-node2 10.211.55.20 k8s-node3
-
将桥接的 IPV4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
应用规则:
sysctl --system
-
date
查看时间(可选)
yum -y install ntpupdate
ntpupdate time.window.com #同步最新时间
3. 所有节点安装 docker、kubeadm、kubelet、kubectl
Kubenetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
1)安装Docker
-
卸载之前的docker
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装Docker -CE
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置 docker repo 的 yum 位置 $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum -y install docker-ce docker-ce-cli containerd.io
-
配置镜像加速
registry-mirrors
后面使用自己的镜像加速地址,可以从阿里云镜像加速器获取sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "registry-mirrors": ["https://r1fl0qlt.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
启动 Docker 并且设置 Docker 开机启动
sudo systemctl enable docker
2)添加阿里与Yum源
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
3)安装 kubeadm,kubelet 和 kubectl
安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
开机启动
systemctl enable kubelet && systemctl start kubelet
查看kubelet的状态:
systemctl status kubelet
查看 kubelet 版本:
> kubelet --version
Kubernetes v1.17.3
4)部署k8s-master
(1)master节点初始化
初始化 kubeadm,下面的命令会下载 k8s 组件的镜像:
$ kubeadm init \
--apiserver-advertise-address=10.211.55.19 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
参数说明:
--apiserver-advertise-address
:这里的IP地址要修改成自己master
主机的地址,我使用的是为三台机器中的第一台k8s-node1
;--kubernetes-version
:配置成自己安装的版本,和上一步kubeadm
的版本一致,kubelet --version
查看版本
注意:如果执行上面的初始化命令报错了,下次再执行初始化命令前,先执行
kubeadm reset -f
执行结果:
如果看到下面的页面,则说明初始化成功
初始化完节点之后,根据日志的提示先执行这三条命令:
# 这个目录会保存连接配置
mkdir -p $HOME/.kube
# 认证文件保存到这个目录下
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)安装 flannel
安装CNI网络插件,这里安装 flannel
创建个 flannel 的目录,
-
下载 yml 文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果上面的网址下载不下来,就去 码云 flannel 上把这个 yml 文件复制或者下载下来
-
创建 flannel
kubectl create -f kube-flannel.yml
-
查看是否成功运行
可以看到kube-flannel
是运行状态:[root@k8s-node1 flannel]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-7d89d9b6b8-bjmsp 1/1 Running 0 36m kube-system coredns-7d89d9b6b8-z46zp 1/1 Running 0 36m kube-system etcd-k8s-node1 1/1 Running 1 37m kube-system kube-apiserver-k8s-node1 1/1 Running 1 37m kube-system kube-controller-manager-k8s-node1 1/1 Running 1 37m kube-system kube-flannel-ds-srf9w 1/1 Running 0 65s kube-system kube-proxy-n64fp 1/1 Running 0 36m kube-system kube-scheduler-k8s-node1 1/1 Running 1 37m
5)添加从节点
-
查看所有节点(主节点运行)
#获取所有节点 $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-node1 Ready control-plane,master 40m v1.22.2
-
获取 Node 节点加入命令
$ kubeadm token create --print-join-command kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
-
在从节点运行输出的命令
$ kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
-
查看节点状态
$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-node1 Ready control-plane,master 68m v1.22.2 k8s-node2 Ready <none> 4m16s v1.22.2 k8s-node3 Ready <none> 4m12s v1.22.2
$ journalctl -u kubelet #查看kubelet日志
监控pod进度
watch kubectl get pod -n kube-system -o wide
等到所有的status都变为running状态后,再次查看节点信息:
[root@k8s-node1 ~]# kubectl get nodes; NAME STATUS ROLES AGE VERSIONk8s-node1 Ready master 3h50m v1.17.3k8s-node2 Ready <none> 3h3m v1.17.3k8s-node3 Ready <none> 3h3m v1.17.3[root@k8s-node1 ~]#
三、入门操作kubernetes集群
1. k8s上部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
其它命令:
# 获取所有的资源
$ kubectl get all
# 获取所有资源的详细信息
$ kubectl get all -o wide
# 获取 pods 的信息
kubectl get pods
2. 向外暴露端口
在master上执行
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
--port=80
:pod 中的端口 80 映射;server 会带来 pod 的 80--target-port=8080
:容器中的端口 8080,会与 pod 中的 80 映射--type=NodePort
:Service 的一种类型,为 Service 在每台机器上绑定一个端口,这样就可以通过NodeIp:NodePort
来访问该服务
查看服务,访问 k8s-node1:30916
(30916 是service自动分配的,服务器的 30916 端口,映射 pod 中的 80 端口)就可以访问到 tomcat :
# 查看 service 的信息
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 91m
tomcat6 NodePort 10.96.96.4 <none> 80:30916/TCP 12s
3. 动态扩容测试
# 查看deployment,只有一个副本
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 1/1 1 1 8m44s
# 扩容成3个副本
$ kubectl scale --replicas=3 deployment tomcat6
deployment.apps/tomcat6 scaled
# 可以看到正在扩容中
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 2/3 3 2 9m35s
4. 删除
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 3/3 3 3 12m
$ kubectl delete deployment tomcat6
deployment.apps "tomcat6" deleted
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 91m
tomcat6 NodePort 10.96.96.4 <none> 80:30916/TCP 12s
$ kubectl delete service tomcat6
service "tomcat6" deleted
5. 格式化输出 yaml
# 打印前面部署 Tomcat 时使用的命令对应的 yaml
$ kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run='client' -o=yaml
apiVersion: apps/v1
kind: Deployment
Metadata:
creationTimestamp: null
labels:
app: tomcat6
name: tomcat6
spec:
replicas: 1
selector:
matchLabels:
app: tomcat6
strategy: {}
template:
Metadata:
creationTimestamp: null
labels:
app: tomcat6
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
resources: {}
status: {}
--dry-run
:值必须为none
(默认)、server
或client
。如果是client
策略,则只打印该发送对象,但不发送它。如果server
策略,提交服务器端请求而不持久化资源。-o
:输出格式,可以是json
、yaml
、wide
等等。
6. 使用 yaml 部署 tomcat
-
使用前一步打印的
yaml
,删除一些无用配置,将replicas
改成3
,使用yaml
文件部署3
台Tomcat
apiVersion: apps/v1 kind: Deployment Metadata: labels: app: tomcat6 name: tomcat6 spec: replicas: 3 selector: matchLabels: app: tomcat6 template: Metadata: labels: app: tomcat6 spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat
-
将上面的 yaml 保存至一个文件中
tomcat6.yaml
$ kubectl apply -f tomcat6.yaml
查看 pod 的 yaml:
# 查看 pod $ kubectl get pods NAME READY STATUS RESTARTS AGE tomcat6-56fcc999cb-b4nt7 1/1 Running 0 2m49s tomcat6-56fcc999cb-pncn9 1/1 Running 0 2m49s tomcat6-56fcc999cb-wczpj 1/1 Running 0 2m49s # 查看 pod 的 yaml $ kubectl get pods tomcat6-56fcc999cb-b4nt7 -o yaml
-
删除用
yaml
创建的 Tomcat$ kubectl delete -f tomcat6.yaml
7. 一些官方文档
1)kubectl 操作文档
https://kubernetes.io/zh/docs/reference/kubectl/overview/
2)资源类型
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%e8%b5%84%e6%ba%90%e7%b1%bb%e5%9e%8b
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。