本质上就是一组服务器集群,k8s可以在集群的各个节点上运行特定的docker容器。是一个容器集群管理系统。
控制器,控制pod,启动,停止,删除
将一组pod关联起来,提供一个统一的入口。即使pod地址发生改变,这个统一的入口也不会变化,可以保证用户访问不受影响
一组pod是一个统一的标签,service是通过标签和一组pod进行关联的
用来隔离pod的运行环境【默认情况下,pod是可以互相访问】
使用场景:
单master
多master(生产环境)
三个节点
2G内存
2核CPU
master
主机名:k8s-master1
IP:192.168.31.63
worker1
主机名:k8s-node1
IP:192.168.31.65
worker2
主机名:k8s-node2
IP:192.168.31.66
k8s版本:1.16
安装方式:离线-二进制
操作系统版本:centos 7.7
systemctl stop firewalld
systemctl disable firewalld
setenforce 0(临时关闭,重启失效)
vim /etc/selinux/config
SELINUX=disabled
hostnamectl set-hostname k8s-master1
hostname
vim /etc/hosts
192.168.31.63 k8s-master1
192.168.31.65 k8s-node1
192.168.31.66 k8s-node2
yum install chrony -y
vim /etc/chrony.config
修改三项
server 127.127.1.0 iburst
allow 192.168.31.0/24
local stratum 10
systemctl start chronyd
systemctl enable chronyd
ss -unl | grep 123
yum install chrony -y
vim /etc/chrony.config
修改一项
server 192.168.31.63 iburst
systemctl start chronyd
systemctl enable chronyd
systemctl restart chronyd
chronyc sources
date
swapoff -a
vim /etc/fstab
删除最后一行
free -m(确认交换分区是否关闭成功)
对称加密:加密解密使用相同的密钥
非对称加密:用公钥和私钥的密钥对,公钥加密,私钥解密
单向加密:只能加密,不能解密。MD5
网络第三方机构购买,通常这种证书用于让外部用户访问使用
自己给自己发证书-自签证书,通常用于内部环境
签证机构(CA)
etcd需要三台虚拟机
在master,node1,node2上分别安装一个etcd。
注意:解压之后会生成一个文件和一个目录
问题:centos7 systemd服务管理脚本在哪个目录
/usr/lib/systemd/system
mv etcd.service /usr/lib/systemd/system
mv etcd /opt/
vim /opt/etcd/cfg/etcd.conf
#拷贝到其他节点
scp /usr/lib/systemd/system/etcd.service root@k8s-node1:/usr/lib/systemd/system
scp -r /opt/etcd/ root@k8s-node2:/opt/
/opt/etcd/bin/etcdctl \
--ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
--endpoints="https://192.168.31.63:2379,https://192.168.31.65:2379,https://192.168.31.66:2379" \
cluster-health
tar xvf k8s-master.tar.gz
mv kube-apiserver.service kube-controller-manager.service kube-scheduler.service /usr/lib/systemd/system/
mv kubernetes/ /opt/
cp TLS/k8s/{ca*pem,server.pem,server-key.pem} /opt/kubernetes/ssl/ -rvf
systemctl start kube-apiserver
systemctl enable kube-apiserver
systemctl enable kube-scheduler
systemctl start kube-scheduler
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
ps aux|grep kube
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
启动容器
scp k8s-node.tar.gz root@k8s-node2:/root/apps/
tar xvf k8s-node.tar.gz
mv docker.service /usr/lib/systemd/system
mkdir /etc/docker
cp daemon.json /etc/docker/
tar xf docker-18.09.6.tgz
mv docker/* /bin/
systemctl start docker
systemctl enable docker
docker info
kubelet接收apiserver的指令,然后控制docker容器。
kube-proxy为worker上的容器配置网络工作
ls kubernetes/
mv kubelet.service kube-proxy.service /usr/lib/systemd/system/
mv kubernetes /opt/
vim /opt/kubernetes/cfg/kube-proxy.kubeconfig
修改一行:server:https://192.168.31.63.6443
vim /opt/kubernetes/cfg/kube-proxy-config.yml
vim /opt/kubernetes/cfg/kubelet.conf
vim /opt/kubernetes/cfg/bootstrap.kubeconfig
scp apps/TLS/k8s/{ca.pem,kube-proxy.pem,kube-proxy-key.pem} root@k8s-node1:/opt/kubernetes/ssl/
systemctl start kube-proxy
systemctl start kubelet
systemctl enable kubelet
systemctl enable kube-proxy
tail -f /opt/kubernetes/logs/kubelet.INFO
kubectl get csr
kubectl certificate approve node-csr-5b8Ajv0qUq-xv6iahZtSKQ_k0bHqznLRYeRNEpvuYJI
kubectl get csr
grep "cni" /opt/kubernetes/cfg/kubelet.conf
mkdir -pv /opt/cni/bin /etc/cni/net.d
tar xf cni-plugins-linux-amd64-v0.8.2.tgz -C /opt/cni/bin/
kubectl apply -f kube-flannel.yaml
kubectl delete -f kube-flannel.yaml
kubectl get pods -n kube-system
kubectl get nodes
这个操作受限于网络,可能会需要5-10分钟才能执行成功。如果网络太慢,会导致超时
由于网速太慢,使用离线包的形式导入镜像
docker load --input flannel_v0.11.0-amd64.tar
kubectl apply -f apiserver-to-kubelet-rbac.yaml
kubectl describe node k8s-node2
#修改镜像加速配置
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
scp nginx-1.7.9.tar.gz root@k8s-node2:/root/apps/
docker pull nginx:1.7.9
docker image ls
#将镜像导出为压缩包
docker save nginx:1.7.9>./nginx-1.7.9.tar.gz
scp nginx-1.7.9.tar.gz root@k8s-node2:/root/apps/
#导入压缩包为镜像
docker load -i nginx-1.7.9.tar.gz
#启动nginx
##创建deployment,通过deployment来创建和管理nginx容器
kubectl create deployment myweb --image=nginx:1.8
## 查看一下deployment的状态
kubectl get deployment
## 查看一下pod的状态
kubectl get pods
## 查看pod的详细状态
kubectl describe pod myweb1-6ff756695f-824fh
kubectl create deployment newweb --image=nginx:1.8
kubectl create deployment testweb --image=nginx:1.8
kubectl get pods
##端口暴露
kubectl expose deployment myweb --port=80 --type=NodePort
kubectl get svc
有两种
docker pull eipwork/kuboard:latest
docker images | grep kuboard
# 将镜像导成文件
docker save 9fccf2a94412 > kuboard.tar
docker load < kuboard.tar
# 为镜像重新添加标签
docker tag 9fccf2a94412 eipwork/kuboard:latest
scp kuboard.tar root@k8s-node2:/root/apps/
# 执行yaml文件
kubectl apply -f kuboad-offline.yaml
kubectl get pods -n kube-system
# 查看服务端口
kubectl get svc -n kube-system
#获取 token
kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d
k8s中用来实现名称解析的是coreDns
kubectl apply -f coredns.yaml
默认情况下,k8s仅仅可以在master节点进行管理
在这里插入代码片
1>将管理工具复制到worker节点【master执行】
scp /bin/kubectl root@k8s-node2:/bin
2>生成管理员证书
vim admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
# 颁发证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-scr.json | cfssljson -bare admin
kubectl config set-cluster kubernetes \
--server=https://192.168.31.63:6443 \
--certificate-authority=ca.pem \
--embed-certs=true \
--kubeconfig=config
kubectl config set-credentials cluster-admin \
--certificate-authority=ca.pem \
--embed-certs=true \
--client-key=admin-key.pem \
--client-certificate=admin.pem \
--kubeconfig=config
kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin \
--kubeconfig=config
kubectl config use-context default --kubeconfig=config
4>将生成的config文件发送到worker节点
scp config root@k8s-node2:/root/
5>在worker节点,基于config实现执行kubetcl命令
kubectl get nodes --kubeconfig=config
mkdir ~/.kube
mv /root/config /root/.kube/