- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
Endpoint Slices
Kubernetes 集群中网络端点的可扩展跟踪。
服务发现与负载均衡
无需修改您的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载平衡。
自我修复
重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会它们公布给客户端。
自动装箱
根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,将任务关键工作负载和尽力服务工作负载进行混合放置,以提高资源利用率并节省更多资源。
IPv4/IPv6 双协议栈
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸缩
使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行伸缩。
1.Master
k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程
2.Node
Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.
每个Node节点都运行着以下一组关键进程
kubelet:负责对Pod对于的容器的创建、启停等任务
kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件
Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作
Node节点可以在运行期间动态增加到Kubernetes集群中,默认情况下,kubelet会想master注册自己,这也是Kubernetes推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操作系统、Docker版本、CPU和内存,以及有哪些Pod在运行等等,这样Master可以获知每个Node节点的资源使用情况,冰实现高效均衡的资源调度策略。
1.Kubelet
负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。
2.Kubernetes Proxy
负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。
3.Docker
Node上需要运行容器服务
Minikube 单节点微型K8S(仅供学习、预览使用)
二进制安装部署:(生产首选,新手推荐)
使用kubeadmin进行部署,K8S的部署工具,跑在K8S里(相对简单,熟手推荐)
k8s最基本的硬件要求
CPU: 双核
Mem: 2G
3台dockerhost
时间必须同步
配置三台服务器的环境
k8s-master 192.168.40.111
k8s-node1 192.168.40.112
k8s-node2 192.168.40.113
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭swap
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
在所有主机添加hosts
cat >> /etc/hosts << EOF
192.168.40.111 k8s-master
192.168.40.112 k8s-node1
192.168.40.113 k8s-node2
EOF
将桥接的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
重启服务器
reboot
安装命令
yum install ntpdate -y
同步时间
ntpdate ntp.aliyun.com
所有节点安装Docker/kubeadm/kubelet
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
安装wget
yum -y install wget
获取阿里云的源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装docker
yum -y install docker-ce-18.06.1.ce-3.el7
启动docker并设为开机自启
systemctl enable docker && systemctl start docker
查看docker版本
docker --version
配置镜像加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
重启docker服务
systemctl restart docker
添加阿里云YUM软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
5.3 安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
将kubelet设为开机自启,先不启动
systemctl enable kubelet
部署Kubernetes Master
在192.168.153.151 (Master)执行
kubeadm init \
--apiserver-advertise-address=192.168.153.151 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装Pod网络插件(CNI)
在master上执行
安装官网的插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安装失败时可以下载我上传的kube-flannel.yml 文件,其中镜像地址已经修改
下载链接>> https://download.csdn.net/download/m0_46674735/14930704
执行命令:kubectl apply -f kube-flannel.yaml 安装即可
[root@host-151 ~]# kubectl apply -f kube-flannel.yaml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
查看pods状态已经全部running
[root@host-151 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-gc8rh 1/1 Running 0 4m39s
coredns-9d85f5447-lr8d9 1/1 Running 0 4m39s
etcd-k8s-master 1/1 Running 0 4m53s
kube-apiserver-k8s-master 1/1 Running 0 4m53s
kube-controller-manager-k8s-master 1/1 Running 0 4m53s
kube-flannel-ds-amd64-sjrbq 1/1 Running 0 104s
kube-proxy-rf842 1/1 Running 0 4m39s
kube-scheduler-k8s-master 1/1 Running 0 4m53s
加入Kubernetes Node
加入集群
在192.168.153.152/153 上执行
命令由初始化master之后生成,直接复制即可
kubeadm join 192.168.153.151:6443 --token 4ewer2.chl3n0wtfi36xc6c \
--discovery-token-ca-cert-hash sha256:78512851a2e78e14ea454f0a65e9853f9085ec8348a2e0f781347fa5c882f53a
查看节点加入成功
[root@host-151 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 5m9s v1.17.0
k8s-node1 Ready <none> 2m58s v1.17.0
k8s-node2 Ready <none> 2m54s v1.17.0
部署 Dashboard
在master节点上执行命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
执行失败时可以用上传的文件执行下面这条命令:
下载链接>> https://download.csdn.net/download/m0_46674735/14930771
kubectl apply -f kubernetes-dashboard.yaml
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部,文档中已经修改,直接运行即可
创建service account并绑定默认cluster-admin管理员集群角色:
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
命令执行成功后会生成token
Data
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg0U010UFVlSnIyZGNtX0tibW9Uc09SNVVFcXF6bUp5Rm9iaDAxX3NtNkU
ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3V
udC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm
5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4td3hnd3oiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L
3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNj
b3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzM4YWNkMGYtYzZhMS00ODUyLTlhMDQtN2QxMDZkMjQ1MGM2Iiw
ic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.AB29CeywV
V67WJtGGebBMJG4sdx9Zff2FRPUtGAkVtKxjUJ2R9AYyIhvJnlxGjCdT2f9wnzoqcps0wXFL-
HAUYbjYd76KZtwT7JopDkNxzo4jVXTQz30sXiYACDU0e914MTsK33pUaK_Fun9nrkmRw71f7N6Ocms9guT5Mccl
XgKr4P-ckP8JShum4fNv2z7SnDK41hq3LM3-ptP3eZShRFcb9-4LnTabRh80T76sVNXC-
2ytnzdum3_lZH53GZO8mMm_z__8SDrKJV27JFcxwE8u9O3EDiU_lxLOEv1fw6kACuRI8YmNP2N-
Ab4w07eh7Qt8PcIEGZcx13N4O3HIQ
显示以上图时
随便点击页面的空白处,然后输入:thisisunsafe就可以了
也可参考:https://segmentfault.com/a/1190000021843971
至此搭建完毕