什么是K8S
- kubenetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
- Master节点上运行着集群管理相关的一组进程:Kube-apiserver,Kube-controller-manager和 Kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和存储等管理功能。
- Node节点上运行着kubelet,kube-proxy服务进程,这些进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡器。
为什么使用K8S
- 新技术的驱动
- Docker容器化技术已经被很多公司采用,从单机走向集群已成必然,云计算的发展正在加速这一进程
- 全面拥抱微服务(微服务架构使得每个服务都可以独立开发,升级和扩展,因此系统具备很高的稳定性和快速迭代能力,开发者也可以*选择开发技术。)
- K8S提供的服务弹性扩容机制面对突发流量
概念和术语
- Master是集群管理的控制节点,基本上所有的命令都发给它,它负责具体的执行过程。
- Node是K8s中的工作负载节点,每个node都会被master分配一些工作负载。
- Pod是K8s最小运行单元。
- Replication Controller (RC)副本控制,声明Pod的副本数量在任意时刻都符合某个预期值。
- Deployment 在内部使用Replica Set(Replocation Controller的升级)实现部署。
- Horizontal Pod Autoscaler(HPA) Pod横向自动扩容;指标:CUP,QPS,TPS。
- StatefulSet 有状态服务。
- Service 就是我们经常提起的微服务架构中的一个一个微服务。
安装K8S [kubeadm方式]
主机 | 类型 | 操作系统 |
---|---|---|
192.168.124.180 | Master | Centos 7 |
192.168.124.181 | Node | Centos 7 |
192.168.124.182 | Node | Centos 7 |
设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
# 修改 /etc/hosts
192.168.124.180 master
192.168.124.181 node1
192.168.124.182 node2
关闭防火墙|禁用SELinux|关闭交换分区
# 禁用主机SELinux,让容器可以读取主机文件系统
setenforce 0
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# #实时动态关闭交换分区
swapoff -a
# 注释 swap 行
vim /etc/fstab
Yum 国内源
cd /etc/yum.repos.d && \
sudo mv CentOS-Base.repo CentOS-Base.repo.bak && \
sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum makecache
配置k8s资源的下载地址
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装Docker并且替换Docker源
# 换源
mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
service docker restart
安装K8S
yum install kubelet kubeadm kubectl
下载k8s依赖镜像
获取依赖的镜像
kubeadm config images list
阿里云镜像下载k8s依赖组件
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' |sh -x
docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#registry.cn-hangzhou.aliyuncs.com/google_containers#k8s.gcr.io#2' |sh -x
docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker rmi ", $1":"$2}' |sh -x
开机启动
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet
使用kubeadm安装Master
kubeadm config print init-defaults > init.default.yaml
kubeadm init --config=init.default.yaml
修改init.default.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 修改为master的ip地址
advertiseAddress: 192.168.124.180
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
# 修改版本为v1.17.2
kubernetesVersion: v1.17.2
networking:
dnsDomain: cluster.local
# 添加pod网段
podSubnet: "10.224.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
### 使用ipvs
### yum install ipvsadm
### 查看 ipvsadm -Ln
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
# 安装成功之后执行以下命令
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 192.168.124.180:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:58056cdd9dfd9cc91da880adc63a2a7e9e7594eeda1bf7c2bcdceb0fbbf255ad
安装网络插件flannel
kubectl create -f kube-flannel.yml
# 查看node还是处于NoReay状态
kubectl get node
# NAME STATUS ROLES AGE VERSION
# k8s-master NotReady master 5h41m v1.17.2
# NAME STATUS ROLES AGE VERSION
# k8s-master Ready master 5h59m v1.17.2
集群
- node1和node2加入节点执行
kubeadm join 192.168.124.183:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:58056cdd9dfd9cc91da880adc63a2a7e9e7594eeda1bf7c2bcdceb0fbbf255ad
- 检测集群是否安装完成
kubectl get node
kubectl get pods --all-namespaces
问题
虚拟机配置比较低,所以会出现一些错误,我们可以按照提示忽略【非生产环境】
[ERROR NumCPU CPU] 必须超过2个,把虚拟机的处理器设置一下即可。
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables] 解决:echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
[ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty 解决:清空/var/lib/etcd 目录
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 解决: echo '1' > /proc/sys/net/ipv4/ip_forward