预备环境:
主机:
2核2g50g,ip:192.168.192.100
节点:
2核2g50g,ip:192.168.192.101
一、环境安装
1.1、安装主机(这里是主机,节点机器注意配置地址、主机名不能和主机一致)
1.2、进行配置(软件选择)
1.3、配置网络和主机名
注意:通过以下方法查看网段
二、环境初始化
注:所有机器都要执行操作
2.1、初始化
2.1.1、检查版本
cat /etc/redhat-release
注:centos版本7.5以上,避免出错
2.1.2、主机名解析
方便集群中节点相互调用
编辑hosts文件,进行解析
成功之后,就能ping到其他节点了
2.1.3、时间同步
需要所有机器时间一致
systemctl start chronyd 设置时间
systemctl enable chronyd 开机自启
date 查看当前时间
2.1.4、关闭系统的iptables和firewalld规则
在使用k8s和docker的过程中会产生很多iptables规则,为了避免跟系统规则混淆,直接关闭系统的规则
关闭firewalld规则
systemctl stop firewalld
systemctl disable firewalld
关闭iptables规则
systemctl stop iptables
systemctl disable iptables
2.1.5、禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭,在安装集群中可能会产生各种奇葩问题
编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
注:修改完毕后要重启linux服务
2.1.6、禁用swap分区
编辑文件 /etc/fstab,注释掉swap分区一行
# /dev/mapper/centos-swap swap
2.1.7、修改linux的内核参数
#创建文件/etc/sysctl.d/kubernetes.conf,添加如下配置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4_forward = 1
重新加载配置
#重新加载配置
sysctl -p
#加载网桥过滤模块
modprobe br_netfilter
#检查是否加载成功
lsmod | grep br_netfilter
2.1.8、配置ipvs功能
在kubernetes中service有两种代理,一种是基于iptables,一种是基于ipvs,如果使用ipvs的话,需要手动载入ipvs模块
# 1、安装ipset和ipvsadm
yum install inset ipvsadmin -y
# 2 添加需要加载的模块写入脚本文件
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#! /bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3 为脚步添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 5 查看对应模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.1.9、重启服务器
reboot
2.2、安装docker
2.2.1、切换镜像源
#切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2.2.2、查看当前镜像源支持的docker版本
#查看当前镜像源支持的docker版本
yum list docker-ce --showduplicates
2.2.3、安装docker-ce
#这里以docker-ce-18.06.3.ce-3.e17版本为例,注意需要指定 --setopt=obsoletes=0,否则会自动更新最高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
2.2.4、添加配置文件
#Docker在默认情况下使用Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来替代cgroupfs
#创建文件夹
mkdir /etc/docker
#添加配置
cat <<EOF> /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
#查看是否配置成功
more /etc/docker/daemon.json
2.2.5、启动docker
#启动docker
systemctl restart docker
#开机自启动
systemctl enable docker
2.3、安装kubernetes组件
2.3.1、切换镜像源
#由于k8s的镜像源是在国外,速度比较慢,这里切换国内的镜像源
#编辑/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
2.3.2、安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
2.3.3、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
2.3.4、设置kubelet开机自启
systemctl enable kubelet
2.4、准备集群镜像
2.4.1、查看所需镜像
安装集群之前,提前准备好需要的镜像
kubeadm config images list
2.4.2、下载镜像
此镜像在kubernetes的仓库中,由于网络原因可能无法连接,使用下面方法替代
#定义下载列表
IMAGES=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
#遍历循环下载,修改下载源是国内镜像,下载后下载源改回来,因为后期下载东西,都是在k8s源中下载的,这里修改下载源主要是为了加快下载速度
for iname in ${IMAGES[@]};do
docker pull registry.aliyuncs.com/google_containers/$iname
docker tag registry.aliyuncs.com/google_containers/$iname k8s.gcr.io/$iname
docker rmi registry.aliyuncs.com/google_containers/$iname
done
2.5、集群初始化
2.5.1、集群初始化
注:集群初始化,只需要在master中执行
#创建集群
kubeadm init \
--kubernetes-version v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.192.100
注意:192.168.192.100是主机的ip
集群创建成功后,有提示创建文件,复制粘贴就行了
2.5.2、节点加入集群
注:加入集群,只需要在node中执行master中提示的,就能将子节点加入到集群中
kubeadm join 192.168.192.100:6443 --token esuo6y.3e1fsds8hcv51yej \
--discovery-token-ca-cert-hash sha256:b9f37f61746d605b7101b7f367a49f895225ca8259238192de12785a8bdeef86
注:上面的代码,是主机搭建集群后给的
加入前后的效果:
2.6、安装网络插件
kubernetes支持多种网络插件,如flannel、calico、canal等等,这里选择flannel
注:这里的操作只需要在master节点执行就可,插件使用的是DaemonSet的控制器,他会在每个节点都运行
2.6.1、获取fannel配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation.kube-flannel.yml
2.6.2、修改文件中quay.io仓库为quay-mirror.qiniu.com(应该可以不用改,改了之后notready)
上面步骤,如果下载不了,直接用
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
2.6.3、使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
2.6.4查看集群节点状态
kubectl get nodes
注:变为ready需要时间,稍等片刻,如果没有的话,
下载 https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz ,上传到服务器中,将flannel拷贝到/opt/cni/bin目录下即可
2.7 服务部署
这里部署一个nginx服务,只需要在主机部署就行了
2.7.1、部署
kubectl create deployment nginx --image=nginx:1.14-alpine
2.7.2、暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
2.7.3、查看pod、service
kubectl get pod
kubectl get service
集群的节点可以通过 主机ip + 32173端口 ,访问到nginx
3、资源管理
3.1、资源管理方式
3.1.1 命令式对象管理:直接使用命令去操作kubernetes资源
kubectl [command][type] [name] [flags]
command:指定要对资源进行的操作,如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
#查看所有pod
kubectl get pod
#查看某个pod
kubectl get pod pod_name
#查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
可以通过kubectl --help 获取各种操作信息
创建一个名为dev的namespace,在dev中创建pod,默认是在default
kubectl create ns dev
kubectl get ns
kubectl run pod --image=nginx -n dev
#查看已经创建的pod
kubectl get pods -n dev
#查看该pod的状态
kubectl describe pod pod-864f9875b9-hfvxk -n dev
#删除该pod,用的run命令,删除后会自动创建一个,直接删除dev就能把里面全部删除
kubectl delete pod pod-864f9875b9-hfvxk -n dev
#删除整个dev
kubectl delete ns dev
3.1.2 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
通过命令加上配置文件操作资源
(1)、创建一个nginxpod.yaml,内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginxpod
namespace: dev
spec:
containers:
- name: nginx-containers
image: nginx:1.17.1
(2)、执行create命令,创建资源
kubectl create -f nginxpod.yaml
(3)、查看资源
kubectl get pod -n dev
(4)、删除资源
#这里删除资源,可以直接通过配置文件删除
kubectl delete -f nginxpod.yaml
3.1.3 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
声明式对象配置跟命令式对象配置很相似,但是只有一个命令apply(该方法只用于创建和更新)
(1)、执行一次kubectl apply -f yaml,创建资源
kubectl apply -f nginxpod.yaml
(2)、再次执行一次kubectl apply -f yaml文件,发现资源没有变动
因为yaml文件没有改变东西,所以不会更新
2.7.4、node节点使用kubectl
在master节点中执行 scp -r HOME/.kube node1:HOME/
3、实战
3.1、Namespace
Namespace是Kubernetes系统中一种非常重要的资源,主要作用是用来实现多套环境资源的隔离或者多租户的资源隔离。默认情况下,kubernetes集群中所有的pod是可以相互访问的,但是实际中可能不想让两个pod之间相互访问,因此就需要将两个pod划分到不同的namespace下,形成逻辑上的组。
3.2、Pod
通过控制pod控制器,来控制pod
#创建pod
kubectl run nginx --image=nginx:1.14-alpine --port=80 --namespace dev
#查看描述
kubectl describe pod pod_name
#删除pod
kubectl delete deployment pod_name -n dev
通过yaml文件来控制
#创建
kubectl create -f pod-nginx.yaml
#删除
kubectl delete -f pod-nginx.yaml
3.3、Label
在资源上进行标签,用来区分标识
#打标签
kubectl label pod nginx -n dev version=1.0
#更新标签
kubectl label pod nginx -n dev version=1.0 --overwrite
#删除标签
kubectl label pod nginx -n dev version-