主机安全配置(所有节点)
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
确认是否运行
firewall-cmd --state
SELINUX配置
做出下述修改,一定要重启系统才能生效
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
主机时间同步(所有节点)
yum -y install ntpdate
crontab -l 0 */1 * * * ntpdate time1.aliyun.com
永久关闭swap分区(所有节点)
使用kubeadm部署必须关闭swap分区,修改配置文件后
需要重启操作系统。
vi /etc/fstab
在swap文件系统对应的行,行首添加#表示注释。
添加网桥过滤(所有节点)
cat /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0
加载br_netfilter模块
modprobe br_netfilter
查看是否加载
lsmod | grep br_netfilter
加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0
开启ipvs(所有节点)
安装ipset及ipvsadm
yum -y install ipset ipvsadm
在所有节点执行如下脚本
cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF
授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs_rr
安装docker-ce(所有节点)
所有节点安装wget和vim命令
yum -y install wget vim
YUM源设置
首先去到 /etc/yum.repos.d/ 目录,删除该目录下所有repo文件
下载centos基础yum源配置(这里用的是阿里云的镜像)
curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
下载docker的yum源配置
curl -o docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
配置kubernetes的yum源
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
执行下列命令刷新yum源缓存
yum clean all yum makecache yum repolist
出现下面列表表示yum源配置正确
安装docker
查看可安装的docker-ce版本
yum list docker-ce.x86_64 --showduplicates | sort -r
如果上面这步显示不出来可用的版本,rm -rf /etc/yum.repos.d/docker-ce.repo 删除这个yum源,重新获取,再来一遍
安装指定版本docker-ce
此版本不需要修改服务启动文件及iptables默认规则链策略。
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 yum -y install containerd.io
查看docker-ce是否安装成功
docker version
设置开机自启动和启动docker
systemctl enable docker systemctl start docker
修改docker-ce服务配置文件(所有节点)
修改其目的是为了后续使用/etc/docker/daemon.json来
进行更多配置
vim /usr/lib/systemd/system/docker.service
新建daemon.json文件
vim /etc/docker/daemon.json
插入下面内容
{ "exec-opts":["native.cgroupdriver=systemd"] }
重启docker
systemctl restart docker systemctl restart containerd
查看是否启动成功
systemctl status docker systemctl status containerd
安装k8s(所有节点)
yum list | grep kubeadm
输入y 回车
如果你上面是单台安装的,只需要将这个yum源scp到worker1和2
scp /etc/yum.repos.d/kubernetes.repo worker1:/etc/yum.repos.d/
这里要输入yes和worker1和2的密码
复制到过去后,需要同样的做验证
yum list | grep kubeadm
输入y 回车
生成 containerd 的默认配置文件
containerd config default > /etc/containerd/config.toml
查看 sandbox 的默认镜像仓库在文件中的第几行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
使用 vim 编辑器 定位到 sandbox_image,将 仓库地址修改成 k8simage/pause:3.6
vim /etc/containerd/config.toml
sandbox_image = " registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
重启 containerd 服务
systemctl daemon-reload systemctl restart containerd.service
安装kubeadm kubelet kubectl
yum -y install --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
systemctl status kubelet
k8s集群容器镜像准备(master)
查看集群使用的容器镜像
kubeadm config images list
将列表中的文件导入到image.list文件,便于制作脚本
kubeadm config images list >> image.list
vim image.list
#!/bin/bash img_list='registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2 registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2 registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2 registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1' for img in ${img_list} do docker pull $img done
sh images.list
docker images
scp传输pause和kube-proxy两个镜像到worker节点
docker save -o kube-proxy.tar registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy docker save -o pause.tar registry.cn-hangzhou.aliyuncs.com/google_containers/pause
scp kube-proxy.tar pause.tar worker1:/root scp kube-proxy.tar pause.tar worker2:/root
在worker节点 load 镜像
docker load -i kube-proxy.tar docker load -i pause.tar
初始化k8s集群
在master节点执行,10.244.0.0/16是固定的,192.168.150.100是master节点ip
kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.150.100 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
如果报下面这些错
请执行下面2条命令后,再执行一次上面kubeadm init …
rm -rf /etc/kubernetes/
swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
看到下面面板就表示k8s初始化成功
初始化成功,注意:把初始化的日志复制粘贴保存,后面有用!
使用集群
master节点
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
所有节点上传calico-39文件夹,导入对应的镜像
master节点修改calico.yml
vim calico.yml :set nu // 显示行号 :607 //跳到607行
在看622行这个地址,要跟kubeadm init 的时候–pod-network-cidr=10.244.0.0/16 保持一致
改完 :wq 保存退出
kubectl apply -f calico.yml
到两个worker节点,分别执行初始化日志中最后的kubeadm join …
kubeadm join 192.168.150.100:6443 --token 0cestx.f8qj3deigs45kdhu \ --discovery-token-ca-cert-hash sha256:804d4ad486083b6a73fbe24db673dda14feea91b40ef15137ff3329c210535da
验证k8s集群可用性(master节点)
查看节点集群所有节点
kubectl get nodes
查看集群健康状态
kubectl get cs
查看集群信息
kubectl cluster-info
查看pods运行情况
kubectl get pods --namespace kube-system
kubectl使用
kubectl帮助方法
检查kubectl是否安装
rpm -qa | grep kubectl
获取kubectl帮助方法
kubectl --help
kubectl子命令使用分类
在worker节点如何使用kubectl命令管理k8s集群?
在worker节点执行
mkdir .kube scp master1:/root/.kube/config .kube/
使用命令验证
kubectl get nodes
NameSpace
查看NameSpace
kubectl get namespace
说明
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态v1.13加入
kube-system kubernetes集群在使用
创建NameSpace
kubectl create namespace test
删除NameSpace
删除命名空间时,命名空间中包含的所有资源对象同时被删除。
kubectl delete namespace test
Pod
Pod是kubernetes集群能够调度的最小单元
查看pod
查看default命名空间中的Pod
kubectl get pod # 或者 kubectl get pods # 或者 kubectl get pod --namespace default # 或者 kubectl get pods --namespace default
查看kube-system命名空间中的Pod
kubectl get pod -n kube-system
创建Pod
编写用于创建Pod资源清单文件
vim 02-create-pod.yaml
apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: ngninx-pod image: nginx:latest ports: - name: nginxport containerPort: 80
应用用于创建Pod资源清单文件
kubectl apply -f 02-create-pod.yaml
查看pod更加详细信息
kubectl get pods -o wide
删除Pod
kubectl命令行删除
kubectl delete pods pod1
通过kubectl使用Pod资源清单文件删除
kubectl delete -f 02-create-pod.yaml
Controller(控制器)
创建Deployment控制器类型应用
通过kubectl命令行创建
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
说明
nginx-app 是deployment控制器类型的应用名称
nginx:latest 是应用运行的Pod中的Container所使用的镜像
IfNotPresent 是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
–replicas=2 是指应用运行的Pod共计2个副本,这是用户的期望值,Deployment控制器中的ReplicaSet控制器会
一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量。
查看Deployment控制器类型应用
kubectl get deployment.apps
删除Deployment控制器类型应用
先查看
kubectl get deployment.apps
再删除
kubectl delete deployment.apps nginx-app
Service
介绍&作用
Service 不是实体服务,是一条iptables或ipvs的转发规则,通过Service为pod客户端提供访问pod方法,即客户端访问pod入口
Service通过Pod标签与Pod进行关联
Service类型
ClusterIP:默认,分配一个集群内部可以访问的虚拟IP
NodePort:在每个Node上分配一个端口作为外部访问入口
LoadBalancer:工作在特定的Cloud Provider上,例如Google,Cloud,AWS,OpenStack
ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
Service创建
创建Deployment类型应用
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
验证Deployment类型应用创建情况
kubectl get deployment.apps
创建Service与Deployment类型应用关联
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
说明
expose 创建service
deployment.apps 控制器类型
nginx-app 应用名称,也是service名称
–type=ClusterIP 指定service类型
–target-port=80 指定Pod中容器端口
–port=80 指定service端口
访问Service以实现访问Pod目的
kubectl get service
删除Service
查看service
kubectl get service
删除service
kubectl delete service nginx-app