Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
Kubernetes 是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现
Minikube:
Minikube是一个工具,可以在本地快速运行一个单点的K8S,供初步尝试K8S或日常开发的用户使用,不能用于生产环境。
Kubeadm:
Kubeadm是K8S官方社区推出的一套用于简化快速部署K8S集群的工具,Kubeadm的设计目的是为新用户开始尝试K8S提供一种简单的方法。
二进制包:
从官方下载二进制包,手动部署每个组件组成K8S集群,这也是目前企业生产环境中广为使用的方式,但对K8S管理人员的要求较高
官网文档
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
- 开启机器上的某些端口。
- 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
# 主机名 hostnamectl set-hostname server1 hostnamectl set-hostname server2 hostnamectl set-hostname server3 # 确保每个节点上 MAC 地址和 product_uuid 的唯一性 你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验 一般来讲,硬件设备会拥有"唯一的地址",但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。 # 允许 iptables 检查桥接流量 确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。 若要显式加载该模块,可执行 modprobe br_netfilter。 cat <正式搭建>/etc/sysctl.conf scp /etc/sysctl.conf server2:/etc/ scp /etc/sysctl.conf server3:/etc/ [root@localhost ~]# sysctl -p net.ipv4.ip_forward = 1 "swappiness为0将导致OOM killer杀死进程而不是允许交换" vm.swappiness = 0 `别忘了添加。当内存OOM时不使用交换分区---当剩余空闲内存低于vm.min_free_kbytes limit时使用交换空间` [root@localhost ~]# free -m total used free shared buff/cache available Mem: 976 587 93 21 295 124 Swap: 0 0 0 # 将 SELinux 设置为 permissive 模式(相当于将其禁用) setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config 将 SELinux设置为 permissive 模式可以有效地将其禁用。这是允许容器访问`主机文件系统`所必需的,而这些操作是为了例如 Pod 网络工作正常。 # 默认情况下,Kubernetes 使用容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。 systemctl enable docker && systemctl start docker 容器运行时是负责运行容器的软件。
1.Server1做免密登录
echo "192.168.235.20 server1" >>/etc/hosts echo "192.168.235.11 server2" >>/etc/hosts echo "192.168.235.12 server3" >>/etc/hosts scp /etc/hosts server2:/etc/ scp /etc/hosts server3:/etc/ ssh-keygen -t rsa -q ssh-copy-id -i root@server2 ssh-copy-id -i root@server32.使用阿里云官方镜像安装kubernetes低版本
cat </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 yum -y --disablerepo="*" --enablerepo="kubernetes" list available --showduplicates yum -y install --enablerepo="kubernetes" kubelet-1.21.6-0.x86_64 kubeadm-1.21.6-0.x86_64 kubectl-1.21.6-0.x86_64
解释:
kubeadm:用来初始化集群的指令。 kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl: 用来与集群通信的命令行工具。(kubelet通过内置的 dockershim CRI 实现与Docker集成)
Kubeadm不能帮你安装或者管理 kubelet 或 kubectl,所以你需要确保它们与通过 kubeadm
安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet
间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如1.7.0版本的 kubelet可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
安装命令插件(可使命令tab)
yum -y install bash-completion echo "source <(kubectl completion bash)" >>.bashrc echo "source <(kubeadm completion bash)" >>.bashrc source .bashrc [root@server1 ~]# kubelet --version Kubernetes v1.21.6
以上步骤三台都做!
[root@server1 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.6 ··· [root@server1 ~]# kubeadm init --apiserver-advertise-address=192.168.235.20 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.6 --pod-network-cidr=192.168.0.0./16 [地址根据yml进行修改] Your Kubernetes control-plane has initialized successfully! >要开始使用您的集群,您需要以普通用户的身份运行以下命令: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config >如果你是管理员则敲这个~ export KUBECONFIG=/etc/kubernetes/admin.conf echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>.bashrc # 参数释义 --apiserver-advertise-address:通告侦听地址,用于指定使用 Master的哪个network interface进行通信,若不指定,则 kubeadm会自动选择具有默认网关的 interface --image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像 --kubernetes-version:指定当前的kubernetes的版本 --pod-network-cidr=192.168.0.0/16:flannel网络的固定地址范围(用于指定Pod的网络范围。该参数使用依赖于使用的网络方案) 现在应该将pod网络部署到集群中 . Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ 然后,您可以通过在每个工作节点上运行以下命令作为根节点来加入任意数量的工作节点 : kubeadm join 192.168.235.20:6443 --token lj7iol.mefy8opnh8stuy67 --discovery-token-ca-cert-hash sha256:04359ea64db4a1d50d3601d8b35778cd82b0bc126271e3b40fd5ba2bc78648bc4.现在应该将pod网络部署到集群中
flanne开源l文件地址
[root@server1 ~]# vi kube-flannel.yml ···复制Github里面flannel的kube-flannel.yml文件
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unused in CaaSP
rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "192.168.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni-plugin
image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.2
command:
- cp
args:
- -f
- /flannel
- /opt/cni/bin/flannel
volumeMounts:
- name: cni-plugin
mountPath: /opt/cni/bin
- name: install-cni
image: quay.io/coreos/flannel:v0.15.0
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.15.0
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni-plugin
hostPath:
path: /opt/cni/bin
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
5.三台主机下载镜像
docker pull quay.io/coreos/flannel:v0.15.0
systemctl enable kubelet.service
kubectl apply -f kube-flannel.yml
[root@server2 ~]# kubeadm join 192.168.235.20:6443 --token lj7iol.mefy8opnh8stuy67 --discovery-token-ca-cert-hash sha256:04359ea64db4a1d50d3601d8b35778cd82b0bc126271e3b40fd5ba2bc78648bc [WARNING IsDockerSystemdCheck]: 检测到“cgroupfs”作为Docker的cgroup驱动。 推荐使用“systemd”驱动程序。 请在https://kubernetes.io/docs/setup/cri/网站按照指南操作 ··· Run 'kubectl get nodes' on the control-plane to see this node join the cluster.8.Server1控制主机上运行(需要耐心等待)
kubectl get nodes kubectl get pod --all-namespaces -o wide [root@server1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION server1 Ready control-plane,master 30m v1.21.6 server2 Ready扩展73s v1.21.6 server3 Ready 77s v1.21.6
kubeadm token list //查看token值,24小时过期(kubeadm init创建了一个有效期为 24 小时的令牌) kubeadm token create //重新生成token值 --print-join-command 不仅仅打印令牌,而是打印使用令牌加入集群所需的完整 'kubeadm join' 参数。 # 默认存在的token: [root@master ~]# kubectl describe secrets [root@master ~]# kubectl describe sa
在任何时候都不应该自暴自弃,自己都放弃自己了如何让别人看得起!



