Hello everyone We are here to talk about the courier Kubernetes. So please check that you're in the right room My name is Rana Berezovsky and here is a Tony Segura Pomidon. We both a part of the courier team and We are here to talk about the recent edition to the courier portfolio The integration with this is one of the most popular container orchestration engines, which is Kubernetes I'll provide a short info to this a Project introduce you to the currently supported functionality and explain about the overall architecture And then Tony will dive into much more detailed detailed explanation of the integration we did and we'll Show you the demo How the neutron networking can serve the Kubernetes cluster So what was the motivation for this project? with the cloud native workloads and Microservices based applications that Gradually take place of the VM based and monolithic applications We see that there is a different options that's popping up there different container orchestration engines such as Kubernetes that try to provide solution for them, but if you want to deploy your Containers aside existing OpenStack VM deployment these options that currently doesn't provide a proper answer Even though Kubernetes is quite extendable platform and there are many options that you can put a different network providers To support the Kubernetes networking these options are usually limited to the container a based environment So you need to figure out how you can put your bare metal or a VM parts if they need to be part of your application on this network And usually there is no unified network that can serve this In in case where some a better security and isolation between tenants is required The way to do it is to deploy containers insert virtual machines, and then each tenant gets its Own virtual machines that can deploy the containers inside but then you end up with networking layers that connects virtual machines and in other network layers that connects containers and This actually has two major problems one is a degradation in Latency and bandwidth this part can be resolved with some technical solutions But more severe problems that we see is the management problem because now the operator will have to deal also a Not only with one orchestration system and troubleshoot and debugging monitoring but actually we still one that connects the virtual machines and in other that connects Your containers Neutron we actually see that it can be the unified platform that can provide good solution for the case that you have mixed environments that you have virtual machines or bare metals and you want to add containers to these applications with options That we currently explore with the fushi Kubernetes It will allow to add storage to the bare metal Kubernetes clusters Which will quite complete this solution and will allow to support also the neutron-based networking and Manila or Cinder based storage in the Kubernetes cluster So what is the mission of this project with all these challenges that we see in the containers environment? We believe that Neutron will be a able to provide the real unified platform to Combine the VM based bare metal based and container based workload in the under under one networking solution and It will actually allow the smooth transition to the containerized world And we see it already happens in OpenStack where OpenStack services or get containerized and orchestrated by Kubernetes It will allow both VM containers to share the same virtual topology and use either layer 2 or layer 3 a Networking that will connect your VMs and Kubernetes Cluster and if there are some existing applications that already deployed in your data center And they're in virtual machines and you want to transition to the micro services you can do it on the on your own pace while rewriting certain parts of the application keeping the rest in the VMs and Take your time when you can combine part of them in virtual machines and part of them in in the containers So what are different use cases we're trying to cover one use case is the bare metal where Containers are deployed on physical machines This use case is usually common when people do care about performance So you don't have additional layer of virtual machine where you run your containers in in such case From the deployment point of view what we'll have we usually have the OpenStack controller node where all the services of the OpenStack are running in the Courier Kubernetes integration the important services that we need are actually two of them as a neutron server and the keystone So there usually be the dedicated node that will host all the OpenStack controller services on the Kubernetes master node In addition to the neutron infrastructure will have the major component the courier controller I'll explain a little bit later. What exactly it does But the main purpose of it is just to bind and translate the Data model of the Kubernetes into the neutron resources and on each of the worker nodes will have the courier CNI which will be called by the Kubernetes qubit agent and this guy will actually do the real binding of the pods and plug them into the Host networking we are the neutron infrastructure Another use case that we support is the nested case where we run the pods inside virtual machines this case is Usually used when we need to have the tenant isolation. So as I mentioned before Each tenant will be allocated to these virtual machines and he will be able to deploy its workloads inside this virtual machines and in Usually for example with open stack you can deploy such cluster with Magnum. So in this case, we'll have a some node to run the open stack services as before and we'll have a one compute node where we deploy the courier virtual machine, which is Actually belongs to administrators that will have courier controller component is that we'll have to go and to connect to the Kubernetes API server and Also to the neutron server to do the translation of the model But it will be actually the only point where we need access to this API's so from the Compute nodes that host worker VMs There is no such component required and the only things that we'll need we'll need the courier CNI to be deployed together with the Cubelet agent There are of course the mixed environments where there are some workloads that require containers virtual machines sometimes bare metals So this is also possible with the courier Kubernetes integration What we'll have in this case usually a number of Networks so one will connect on the VMs that host containers and in case you use Magnum So this network is usually will be deployed as part of the Kubernetes cluster and We'll have additional networks that will connect the tenant containers that running inside VM and this is done by a Trunking the container support through the hosting a VM a port into the network So what is the functionality that we support right now? first first the Mod of the networking that we decided to support is the actually Kubernetes native Networking mode When all there is one subnet and all pods are deployed on this subnet so in case It will require some isolation. It should be achieved through the Kubernetes networking policies We don't have isolation right now by the network or some net layer So There is one single tenant and there is full connectivity which is enabled by default We support the cluster IP service type of the Kubernetes This one is implemented through the neutron L load balancer API we disable the Q proxy and use neutron load balancer obstruction and API just to go and Support the Kubernetes services our default provider for this is HE proxy and we actually plan to move to the Octavia in the next release and We support of course the bare metal and the nested Cases and the mixture of different workloads if you have your bare metal VMs and nested containers just a quick intro of the overall architecture that we have in the courier Kubernetes as the main service and centralized service is the courier controller This service is responsible to watch changes that happen in the Kubernetes API It watches for the changes for events on the pods on services and on the service endpoints once there is some a new pod service on endpoint created or there's some modifications Courier controller translates these changes into the neutron model so it either allocates creates ports and allocates IP from the cluster subnet In case of the services it goes and create load balancer listener and pool And once there are some endpoints added because there are new pods added to the replication through the replication controllers that touch to this service. So it will also create the member in the neutron load balancer instance The courier CNI component is essential part that should be deployed on each worker node And this one because there is such component of each worker node we decided that from the integration point of view this component shouldn't have access to the neutron API and keep the existing APIs that already there because the Cubelet is there so the courier CNI can get information through the two sources either from the cubelet or the environment Where it's deployed or it can get the additional information in the instances or entities of the pods Because the courier controller will annotate with required information to do the local binding So this will include the MAC address and the IP address and the port types it will need though the courier CNI will perform the local binding of the pod by creating the virtual interface pairs and then plug one end of it into the Pod namespace and another one into the host networking stack through the neutron infrastructure a we use two essential OpenStack services Neutron and Keystone Keystone for authentication and Communicate with neutron through the Neutron client and we also try to use as much as possible various Open OpenStack services in our integration. So we use Oslo config for the configuration management And versioned objects to keep the format of the annotations that that we Propagate from the controller to the CNI. So this will allow much easier a rollbacks and upgrades and It helps in case you need to upgrade the version of of your deployment a Bit about how we translate the Kubernetes service. So in a native Kubernetes Implementation, there is Qt proxy that uses the IP table IP tables to to program the required rules to do the load balancing We because we have the neutron back ends. We actually don't need this component. So this component is disabled and we can choose whatever component is there to support the Neutron load balancer API For now, we have HEProxy in the future. We plan to move to Octavia and From the translation point of view. So in a Kubernetes service, there's usually cluster IP Which is mapped to the virtual IP and the neutron load balancer language We use the same subnet that Kubernetes defines for the cluster IP range and this subnet is used for the VIP allocations So once there is new service created There will be pool created a neutron with a listener and then for every pod That belongs to the service there will be member added in the neutron a balancer instance So now I'll pass All right, so I'm going to give you a bit of a deep dive Just to get about the feeling of of the of the room How many of you have tried? Kubernetes That's a very good show of hands and could air Kubernetes just in case Okay, we have a couple. That's good. All right. So let's get started with this as It and I said there is the cool the cool rear controller the cooler controller I'll spare you the details. This is something that it and I already said maybe I'll add some information that Thanks to Steve door, which is also an open stack project. We are completely pluggable So if you were to say, okay, I like what could air Kubernetes does But for example, I want to do something extra for the ports or I want to use these other load balancer application that I have or some Provider that has I don't know some hardware that also integrates with the neutron as long as it plays nice with the neutron ports You could do that or you could even trash our drivers. So there's You can change the how it sees the events and what it does with the events So in that sense, you could say, okay So I want to just not use neuter at all and I use ODL or or straight some SDN You could do that just changing and making your own modules available in the system and pointing to them with Steve door. So In this sense, it is very pluggable. Sometimes we think it's a bit too much pluggable And you don't know which things play with each other So we're gonna have a feature there that is gonna say, okay This is the vanilla configuration and it will load all the drivers that play well with each other And yeah, finally we use OS beef for the for the interface plugging so the way the contract between the controller and the CNI component of courier is The beef the OS beef objects this standard open stack And the good thing about that is if you were to say I only I'm interested on the CNI part you could make your Pod creations already include the beef information the courier CNI would already pick that up And you would not even need to run the controller But you should it's a nice project So this is a bit with 1.6 Kubernetes Role-based taxes control became very important and this is what I use for the demo Yes, I cut it down because I had some extra permissions for some open open shift objects that I removed last minute And basically this is what the controller needs and as you can see what it does the most is to get and watch objects and The ones that we really use now are the pods the services and the endpoints But I added some more in case we will want to do something for example somebody from Samsung send a patch about That's our IOV So that if you want to manage a poll you could for example use the node object and put information in the node object about Which virtual functions are available? So that's why it is there. It's not used now and then in terms of patching which is what we do to So that the CNI finds information that the controller put We put all those resources, but mostly we use pod services and endpoints as well and Service status is a special object that allows you to implement the load balancer type so that when you have Service that you want to make available outside of the cluster You you use the load balancer type and then it will get a in our case We implement that with a floating IP or we will implement it because it's only been Prototyped All right, so for the CNI part This is a bit to give you on on the left hand side Wait your right hand side That is The information that the CNI expects to find this is I cut some of the versioning information because otherwise it was like three pages long but you can see that has all the information need for for a beef for a virtual interface and The thing is when it runs on bare metal and I'm gonna show a very detailed flow It needs this information to perform the OBS binding or OVN or dragon flow and whatnot As long as it can bind with Nova it should be able to bind with Could hear Kubernetes we support CNI 0.3.0 and as long as and as soon as another one comes out will support it and if By default we'll output the latest one, but if keep the cubelet asks an older one We're able to convert it ourselves. So it's that's fine And and the way that it works now. It's just the cubelet calls the CNI. It's an executable. It watches the the Kubernetes API and Once it sees the annotation put by the controller it can already proceed, but let's Look a bit about the permissions as you can see since it cannot really It doesn't need to change any information. It only needs to to get Unlist. All right, so let's look with more detail. I Hope I will not bore you too much with details, but let's let's go a bit through the flow. So you understand how this all works So the user creates a pot Coulder controller and cubelet are Applications that their main business is watching what what happens in at the API level what the user defines and The result of creating the pot is that events are sent out to all the watchers So in parallel the cooler controller and cubelet will perform Their duties so the cubelet will create the infrastructure container and Then it will ask CNI local CNI In order to get it networked and wait for it to return. So in the meantime the cooler controller will be creating the neutron port it will Then check the port Get the port information annotate and put it on the Kubernetes API server with a patch request That will trigger another modified event that will be picked by the courier CNI Which I did this point is already watching for the beef information and then it will call the plaque method and That will trigger the OBS Asian if you're using the reference implementation to Start the dance of getting the information from from neutron to perform the binding and set up the flows and so on and once the controller sees that The port is active you see there that you have like a loop that is showing port all the time until it sees that it's active Once it sees that it annotates saying it is active and then the courier CNI will return control to To the queue let it will finish its job And then the pot can already work and we guarantee because it is active that That no package will be lost because of it not being ready and you if you're paying attention It will say okay. There's a bit of of a big amount of round trips here We're aware of it and the way we're solving that is we're gonna pull resources We have some patches in flight for that and what we're gonna do is we're gonna have already bound ports In the computer in the worker nodes of Kubernetes So when you need a resource the controller will just say use this one of the pool and then the courier CNI will just move it Inside the container and this is done alright, so that now if we look at what happens when the Kubernetes cluster runs Inside no instances and this is a very important use case for us because we want to make open stack The best platform to run Kubernetes on and its derivatives, of course What we use for that by default is Neutron trunk ports this started with Okada and What it does is basically this is what you usually have but As you can see there is a bridge that probably you're not familiar with there in the middle It's called the trunk bridge and You see that the top device instead of being attached to the VR int is attached to this bridge and the reason why is because This port has been made a trunk port which means that it can be split into several Supports and pen and port so the the F zero it's on villain Zero so it gets a split into that trunk port that you have in purple there And when you start launching pods what happens is even if the pods are in the same network They get different villains what this means is that in the trunk bridge They will be able to be split into several separate ports. There you have the Turquoise green. I don't know and the pink sorry for the color choice. It's a bit but but and then you can see there is that on the upper side You see the pot has a device that comes with a villain tag Then in the middle layer, you can see that that villain tag is stripped And they are separated into internal ports of that bridge that are used to patch to the OBS VR int and there you already have the regular subnet that you're all familiar with that are corresponding to the subnet What this means is that when a pot wants to talk to another pot It will still go all the way to be a rint even if they're running on the same VM and this allows you to apply things like policy Between pods that are running on the same subnet and and this is something that With other implementation to have you could get rid of but if you would need the security group model that would Have this requirement. It would allow you to do that If there is any question at any point because this is the deep dive part Really just go to the to the microphone and ask I'm willing to spend the necessary time for everybody to to be confident of their knowledge on this so This is how it looks like when you're creating a pot inside Nova instances So you can see it looks almost the same the difference is that when the port is created automatically afterwards You can see that it does allocate villain ID and this means that it checks which villain IDs are being used on that Nova instance at zero it will select another one of the 4096 the tar available and it will add the port to the to the trunk the new port that it created it to light it to the trunk with that villain ID and then it will wait for the Trunk service of Newton. So in your Newton deployment, you have to enable the trunk service Which by default usually doesn't come enabled. So remember to do that. Otherwise, you will spend time like me figuring out what is going on and Once that is done The port is active and it will send the notation that it is active and could see and I can return But as you can see on the on the courtesy night Side this time we don't need to perform any plugging because it's just creating a villain device and that's all Okay, so now As it and a set with this release weathered service to port and the flow is again since this is our architecture It's a bit similar, but it doesn't involve CNI. Obviously this time what it does is it sees that survey that the service is created and logically endpoints follow and With information about that it will create a load balancer wait for the load balancer to be up So there's some pulling there. So it's also a candidate for Making a pool of load balancer so you can use them faster when you need them Then it will create a listener and listeners. We just use them very plainly like just for the port if we when you will support Ingress control sorry ingress Objects in in Kubernetes then we'll probably use them with the layer 7 policies to be able to differentiate between paths and so on but for now It just plain listener the pool and then for each endpoint that every time we see a change on endpoints we check that the List that we have in the members and the list that we get from endpoints might and we remove and add whatever is necessary All right, so as I said, there is this work going on thanks to the the folks From the super I go ahead Sorry, so the question was if We are doing the load balancing for all the endpoints Sorry for the endpoints or the external endpoints The answer is it's for the this is just for the services to work and with the pods So it's for all the endpoints And the external ones the ones you would put with external ip Would be processed separately by having a floating ip assigned to them. This is something that we don't do yet We don't have support for external ip Because most people were just wanting to use the load balancer type But if people would come up and say look we would want to support external ip We would we would also add that Without much cost to the flow that we saw before Thank you for the question So the super fluidly the folks are interested in Deployments that are side by side open stack Kubernetes and kubernetes using neutral networking and they are interested in creation That the creation goes very fast of the resources so the current Uh state of things where you need to go to neuter many times and so on it's it's not something that That is satisfactory for anybody, but they care a lot about it. So they Send some patches as I said they already work. We're just Bike shedding a bit about how they Should look like But you can see the performance difference between how it is in potting bm now to create 50 containers and how it is once you have the resources pulled And and the difference is like almost eightfold Better with with the pool resources. We hope that this will be available in pike However We'll see it's it's it's almost ready to merge. Yes. Go ahead This doesn't depend on anything special from so the potting bm part. Yes, it needs Okada, but the resource part it could work even with earlier releases So the to get the pulling you will need only for kudir the The pike release for neuter and you will be able to use all the releases Newton For potting bm it will not work because of the lack of trunk ports unless you use We have some people from intel submitting a patch So instead of using neutron trunk ports, it will use allowed IP addresses and mac villain devices And in that case you would be able to use newton even with with the pulling And and the way that we're doing the You have more okay, so thanks And the way that we're doing this is we're doing it in a burst Tolerant way So if you have the typical use case of 9 in the morning, everybody gets to the office and starts firing services and containers And let's say that you have a pool of 50 and suddenly you have 100 containers be created. So what we do is we Double the amount of stuff and as they get less and less used We clean up and reduce the size of the pool again But we don't aggressively try to keep the pool at the same size. So if you have a lot of Of churn of containers we can we should be able to keep up with that All right, so we get to the time of the demo here. You have two options You can ask me to run the demo live and I will pray to the demo gods Or we can have a recording. Anyway, if the live one would fail we could have the recorded one and it's exactly the same deployment So The deployment that I did was two Parametal servers you can see them as r 510 or two on r 510 or three the one 510 or three was deployed with pack stack It is okada And there you have the typical stuff that that gets deployed with pack stack like glance nova cinder neutron keystone And all that jazz Then on the other one I added it as a work as a compute node afterwards And then I created I used a project called courier heat that we are Incubating and then it will move inside courier Kubernetes. So I used Some heat resources to be able to create the VMs and the trunk boards and so on So I wouldn't have to create them one by one by one and then We have the I don't know how many people are familiar with the Kubernetes guest book example application Okay, some people so it's it's a very basic application that needs Two tire application. It has a front end that is some javascript with php to decide to to find The back end services it uses php, but otherwise it javascript And then underneath as a storage it has Redis it has a master and as many slaves as you want So let's let's get that going so Do you want me to try to run it live? Yeah, okay All right, uh, wait somehow it went Right, all right So I'm in the right machine Do you think I should make it bigger a little bit? Okay Like this bigger people in the back. Is it okay this size? Okay, cool So I have this script that sends the commands for me, but it's happening live. I'm just Too tired to remember all the command by heart And this is actually the same that will be posted on youtube afterwards And it has some explanations about what he's doing But I already made those explanations earlier This is about I'm writing like this is Just a picture that you saw before when I'm gonna edit on youtube I'm gonna make an overlay here fancy weather showing the diagram at the same time And also giving details about what I used that it was pack stack I want to Tell you that I'm gonna make a blog post about this so you can do it at home And But the big important thing is after running pack stack You should make sure that your obs fire so that your firewall driver for neutering is obs because otherwise With a hybrid driver there is Some problem with the transport that the communication doesn't go anywhere And you're gonna keep wondering Three hours if you're like me what is going on? All right. So yeah here. I'm gonna show the guest book application so typically the guest book application comes with three services and Each service I think the front end And the reddies and slaves are in three replicas but since I was I was using a machine that was not very powerful I reduced to one replica and then it will scale so that you can see that scale still works So yeah here As you can see I modified it to one replica, but otherwise it's exactly the same application um One difference that that is here is since I'm not running kube dns you could run kube dns I just Chose not to so I changed Near the bottom you can see there the value m that means that In order to find the services instead of using the dns resolution It's just checking the environment variables that the kubelet sets About the services So let's clear that So yeah the subnets that we use for this demo are three one is for the Pod subnet The other one is for the vm subnet and the final one is for the Service subnet so in this way you can you can imagine that they are All connected to the same router so that the communication works But it's also giving you the idea that you can have Several neutron networks running inside the instances. So if you would want to have a driver that actually Put different namespaces of kubernetes in different subnets for more isolation and security groups You would be able to do that without any difficulty. All right, so now We'll start getting to the real interesting part that can actually fail So this is all in a namespace that I created called demo All right This went fast So now what we're going to show is that the pods are actually being created As you can see they are still creating what this means is that Now it's a time when there's the dance between neutron and The so the current courier controller Kubernetes API and so on and this as I said before with that graph With the pulling goes much faster And it creates a support. So we're going to show how the supports Are actually being created and this is something interesting that usually if you have Courier you will see that the device owner is usually compute colon courier Just like you have compute nova but when you create a A trunk port the new put supports what actually happens is that The trunk ports Overwrite the name that you put for the device owner. So they put trunk ports And as you can see here like we have the front end It already has an IP of the subnet the slave and so on All right And yeah one one useful thing for the die thing is quite powerful for for those managing These environments is that we Have deterministic names for the pods so that you can Find your pod when you're doing open stack port list So this gives you a visibility even in this case where the pods are running inside virtual machines right, so this is just to show that The The kubernetes site gets reported from cni the right information about the IP other thing that that Neutron and courier did for it Just to confirm All right, so let's look At the at the service side of things and here i'll apologize for not using open stack Common line interface, but this is because it doesn't support lot balancer yet So we had to use neutron for the neutron all cli for it So you're going to see a lot of this is deprecated messages So we check the services. We see that they are created The cluster ip of course you have to make sure when you make such deployment that the cluster Subnet range that you give kubernetes and the one that you create in neuter is the same Otherwise, you're gonna have a lot of fun another important aspect that I want to remind people because I've fallen into this trap before Is that kubernetes when you give it the the cluster ip range Doesn't allow you to give it Anything other than a sider so you cannot say okay just reserve this ip for the router Of the of this subnet So make sure that the router port that you put on it is on the last ip so in this case i think i have it on Well on 254 of the last of the last part of the subnet just just so you're careful Some people that want to be extra careful. They create a fake service definition with the ip of the router so that kubernetes will not allocate it Because in the pot case we allocate the ip s and we report them but on the service case It is kubernetes who demands the ip s because when you define a service This is your prerogative to define the ip that you want for that service So kubernetes is right in doing things that way So you can see that the front end has a single ip And what we're going to do is Check that the load balancers were actually created and it has the members So as you can see this is using uh ha proxy And I see that I have an old front end from a previous demo run That I probably avoided before it had the chance to clean up So then the listeners it will probably also have an extra one from I know this this one was cleaned up All right, so as I said, this is by listeners with anything also Pay attention that it's a deterministic name namespace slash name of the of the service so it's easy then to To find out the stuff and then the pools Okay, so we have demo front end So now what we're going to do is to use the kubernetes api to scale the deployment And and as I said before like with with kubernetes controller We'll just check that there is a difference between the the endpoints it knows about and the pool members And it will create both the the port And it will also add it to the member list Right, you can see that that is a new one I don't I right now. I don't know which is the new one and which is yeah The old nine is the new one right and hopefully the member list will already be there. Yeah, it's already updated So now, uh, what we'll do is to verify that, uh, the pods can talk of one service can talk to other services So let's get the ip of the front end service Okay, so it's 172 30 194 and 45 And we will just ping it from another one which is the simplest test that we could do Good, that's always good when it works until this step So as you can see this is running obs so the first the first ping takes longer than the than the rest because It has actually to go to the user space and install the flows And now well what we will try is the actual application. So I just hope that it all works fine In order to do that since this is running on a server that Is on my company vpn network, and I don't even know what it runs I'm gonna have to assign a floating ip to it. I've made a mistake Maybe I'll have to do this this part by hand Right Um, yeah, we're short on time. Okay, so I'm gonna put this part out of the of the video because I'm Being told the time out of time. Let's just move to it Uh, yeah, so floating ip list Uh, and then you can see here that I had a Free floating ip that I had to assign And here I had the the port so you can just take the port of Of the service of the of the vip and just assign it like that Okay, so once it is associated we can already go to the gas book application This is the floating ip that I assigned there in the In the search bar and then what I try to put is let's go Celtics to see if if they manage the wind tonight And As you can see the application works and now what we're going to show is uh how When you delete the cluster the resources are cleaned up So let's do we have time or I speed it up Okay, well, so I use the label selectors to delete the the resources And you can see here that the deployment and services are being deleted And now what we're going to see is that when we do an open stack port list Very fast it deleted Four of the port there one was still being deleted, but it eventually Uh, all gets deleted and the load balancers are all gone. So thank you for watching the demo And if you have any question, please Go ahead go to the microphones and just ask us Lights to finish up All right, right. Yeah, we have uh, I forgot that we have actually some slides about future Features, so we have ingress support policy support coming up Then the resource management means this pulling that I was talking about so this will be sped up And then uh improvements We want to split the cni into a demon and an executable So the demon will be able to keep already information about what's going on So no if you imagine that you have a lot of worker nodes all connected to the same Kubernetes server, so Uh, and all of them get a lot of pods scheduled that's a lot of connections happening to the Kubernetes API It would be more load So we're going to reduce that by having a demon and then to have a cha for the controller So we would like you to join us even if you're an operator or even if you're a developer Just everybody has things to contribute even if it's just requirements or feature requests Bring them up on irc or on the mailing list And here you can see Some blog post that helps you get started trying the nested feature. As I said, I'm going to tweet Soon about some other way of doing it with cube atom and so on And uh, yeah, this was the the old slide for the for the services For some other demo that we had prepared Uh, and so if you have some questions, maybe we have some time for it. Otherwise you can catch us afterwards All right, so thanks a lot I hope to see you soon


Welcome back to our lecture series math 1210 calculus one for students at Southern Utah University as usual of your professor today Dr. Angela misledine in this lecture number 14 I want to talk about limits which approach infinity for which there's really two types of limits We have in mind So one type of limit we mean as you approach infinity would be something like When the variable x itself approaches plus or minus infinity of f of x what happens in that type of setting? Well, this leads to the notion of in behavior. Sometimes it leads to something like a horizontal acetote That's something we'll talk about in later videos in this lecture The the type of limits as that approach infinity that I want to talk about in this Video will be limits of the form where we take the limit as x approaches a from the right or the left So a is itself a finite number and it turns out that this limit is equal to positive or negative infinity So the limit itself is Infinite Which is a different type of limit at infinity I would like to talk about and so in this discussion This leads to the notion of a vertical acetote if a left-handed or right-handed limit approaches positive or negative infinity This is manifested as a vertical acetote on the graph of our function and typically that Function will have or that limit. I should say we'll have the form of r divided by 0 where r is any Non-zero real number and so if you get something like a non-zero divided by a zero That's going to give you a limit of plus or minus infinity And that'll indicate you have a vertical acetote on your graph So we I want to first mention some functions that we've talked about before that do have Vertical acentotes one famous family of functions would be the reciprocal functions, of course So if we think of our x and y axis here for a moment if we take the function So like 1 over x you're gonna get a graph that looks something like this In the first quadrant it would look something like this in the In the third quadrant there. So this would be like y equals 1 over x I said to the first but honestly if you have any odd power Your function is gonna look something like this and some things I can say about the vertical acentotes of this function This reciprocal function. It'll have a vertical acentote at x equals 0 aka the y-axis For which you can see that on our picture right here You have this vertical acentote, but we can actually do a little bit better than that Notice that as we approach zero from the right and the left we can say something about that So as you approach zero from the right Then your function 1 over x to an odd power is going to give you positive infinity on the other hand if we take the limit as x approaches zero from the left of 1 over x to some odd power This is actually going to give us negative infinity as we can see it's going off towards negative infinity there If we were trying to graph this for even functions Let's say we looked at 1 over x squared 1 over x to the fourth etc If we wanted to graph this for even functions For which I think I'm just going to rewrite it To avoid any potential confusion there. We take 1 over x to some even power Then some things we can see about the graph will be very similar some things are going to be very different We're gonna see that for an even powered reciprocal function You will still have a vertical acentote at the y-axis The first quadrant is actually going to look very similar and therefore you see the same limit the limit as x approaches zero from the right of 1 over x to an even power This is still going to equal infinity The main difference is what happens to the left side of the y-axis You're going to get something that's actually the mirror image of what you saw in the first quadrant And therefore you're going to see a mirror image of the limits You're going to see that as x approaches zero from the left of 1 over x to an even power This is also going to turn out to be Positive infinity and that's what this information right here is trying to summarize here that whether your exponent is even or odd If you approach zero from the right 1 over x to the end will become infinite On the other hand if you approach zero from the left 1 over x to the end will approach either positive infinity or negative infinity positive infinity when you're even and Negative infinity when you're odd and this has to do with of course Powers of negative numbers notice if you take negative one squared you're going to get a positive one But if you take negative one cubed you're going to get a negative one even powers of a negative will give you something positive so taking an even power of Numbers that are negative but getting close to zero will will it make it positive the answer you get positive infinity on the other hand if you Take an odd power of negative numbers as they're getting closer to infinity That's going to always be negative and that gets you towards negative infinity here So while you can memorize these statements I think it's better to think about the graphs of these things if you remember the graphs of these reciprocal functions You can always reverse engineer these statements about limits as you're approaching the vertical asymptote of our function or not And so this becomes even more true. I think when we start talking about vertical asymptotes of Trigometric functions so while sine and cosine don't have any vertical asymptotes the other four trigonometric functions do so imagine tangent for example tangent if you approach Pi halves plus pi k where k is any integer from the right You're going to get negative infinity But if you approach pi halves plus pi k from the left then you're going to get positive infinity that can be very difficult to forget What's going on there? It's like positive negative You know, it's almost like a random guess that you're gonna be right half the time but also wrong half the time when it comes to tangent I think it's useful if you want to think about it graphically To think about the principal branch of tangent, right? So tangent has is its principal branch this continuous piece right here, but then when you hit pi on The right or if you hit neg excuse me if you hit pi halves on the right x equals pi halves Or if you hit negative pi halves on the left this is where you're going to be Hitting your vertical asymptotes and so this is where we can ask or make statements about limits So what I would like you to think of is the following Okay, if you're taking the limit as x approaches pi halves from the left of Tangent here you can see that we're going to be approaching positive infinity as tangent approach a vertical asymptote from the left It'll go off towards positive Infinity but as we approach it from the right We see that the limit as x approaches negative pi halves from the left of tangent of x We're gonna end up with negative infinity Because of this picture right here and therefore because tangents periodic if I were to draw the picture again I know though if I were to approach if I was to approach pi halves from the right That's gonna be negative infinity. I don't necessarily memorize these limit statements. Oh if you approach from the right It's negative infinity if you approach from the left is infinity what I would say is remember the picture Because if you can see the picture you can always answer the question Okay, let's see if tangent is approaching a vertical asymptote from the left It's goes it's gonna be positive from the right to be negative. You can then figure out these things Similar statements can be said for cotangent for secant. It gets a little bit more complicated There's actually four possibilities to consider for secant cotangents a lot easier Because with cotangent let me kind of erase this Do-do-do-do cotangent your picture is gonna look like so Your asymptotes in our slightly different location. You're gonna get your asymptotes at zero and at pi Pi and zero so if ever you're taking the limit as X approaches any any vertical asymptote, right? So this is gonna be multiples of pi if you approach it from the left of cotangent You're gonna end up with a negative infinity, but if you're approaching from the right Zex approaches pi k from the right of cotangent of X. This is gonna be positive infinity You can remember this from the graph, which is what we're saying down here as well Let's try this one more time with say secant What is your basic secant function look like you're gonna get something looks like this and you're gonna get something Looks like this again. These are not the best the best drawn secant functions I do apologize for that But the intuition is what matters here not the artistic prowess, right? You see that it depends on which asymptote you're at so it gets a little it gets much more tricky with secant, right? So secant as the reciprocal of cosine Secant will be undefined. I'll have a vertical asymptote whenever cosine goes to zero which is gonna happen at pi halves It would happen at three pi halves. It would happen a negative pi halves So the exact same locations that tangent as a vertical asymptote and so this is where we have to be careful So if we're approaching pi halves from the left Why is going to approach infinity? But if we're approaching pi halves from the right Then why will approach negative infinity? It becomes almost impossible to just purely memorize all these things these limit statements That is if you take all of these limit statements and their greatest generality It becomes very difficult and so I would suggest when it comes to trigonometric functions rely on the graphs If I can think of what the graph of secant looks like remembering the vertical asymptotes of secant and tangent Will be exactly when cosine goes to zero I bet you I can reverse engineer this thing and another thing to remember about secant's graph is as it's the reciprocal of cosine You kind of see this like bending away From the cosine curve you can reproduce the picture secant on Demand same thing with cosecant and thus you could calculate these limits on demand when really is necessary the other family of functions in In a in a in a calculus setting that we really would want to discuss that have vertical asymptotes are gonna be logarithms The natural log is a good candidate to explain what's going on here for your standard natural for your standard logarithm You're gonna get a graph that looks something like the following Right why equals the natural log of x of course if you modify the base That'll stretch this thing this will make this thing taller or smaller can also reflect and you get something that looks like the following In either case though, you will have a vertical asymptote at The y-axis again x equals zero and so for the natural log We see that as x approaches zero from the right the natural log will go towards negative infinity It's going down down down down down down down down down Again, if you reflected this natural log Or any logarithm across the x-axis you can't get a decreasing logarithm like so in this situation Then as you go towards zero from the right you'd be approaching positive infinity So rely on your knowledge of the graphs the reason Honestly, I think the main reason why it's so important for you as a calculus student to be able to represent functions in different ways Is that different representations have advantages? If you tried to do limit calculations only algebraically that'll only get you so far There are times where a graphical approach will be superior and I think when it comes to discussing vertical asymptotes It's very important to remember the graphs of the functions that are in play Let's look at a few examples and see what's going on here So if I have the function or if I had to compute the limit excuse me the limit as x approaches 2 of 3x minus 2 over x minus 2 The first thing I would be want to do is plug in x equals 2, right? because When because it's a rational function, it's continuous on its domain So as long as the denominator doesn't go to zero then the limit calculation will just be the function evaluation So I'm just gonna plug things in to see what happens You're gonna get 3 times 2 minus 2 over 2 minus 2 for which the denominator We can very quickly see becomes 0 that gives us some concern But if the numerator is also 0 it means that I might be able to simplify the rational function to determine what the limit is I have a removable discontinuity But we see that the numerator is not that it's not gonna be 0 here We get 3 times 2 which is 6 minus 2 which is 4 we get 4 Over 0 which this indicates we don't have a removable point, but this does tell us we have a vertical asymptote So if we're looking If we're looking for the vertical asymptotes of the function then it's exactly these limits of the form a non-zero Over zero so we found a vertical asymptote But maybe we want to find a little bit more about what's going on here So if we think about it graphically Right, what's our function doing? Well, is it maybe both sides of 2 go off towards infinity? Maybe one side goes to infinity the other side goes to negative infinity Maybe they both go down to negative infinity or maybe the right side goes to negative infinity the left side goes to positive infinity We have to investigate this thing a little bit more. Okay, because there are these different possibilities so if we consider the limit as x approaches 2 from the right of 3x minus 2 over x minus 2 well We're gonna do here. I'm gonna suggest a strap I'm gonna suggest a strategy to you that is not exactly in common use, but works super well Well, we're gonna do it's since we're approaching 2 from the right We're gonna plug in what we will denote as 2 plus So we're gonna get 2 plus minus 2 over here. All right, and we can do that in the numerator as well It's not actually necessary in the numerator, but we'll just do it for the sake of it Okay, and so what I want you to think about this is that when I say 2 plus I want you to think about it is what if we were to pick a number that's a little bit bigger than 2 All right, if you take a number that's a little bit bigger than 2 and you times it by 3 You're gonna get something that's a little bit bigger than 6.  On the other hand though, if you take a number that's a little bit bigger than two and you subtract from it two, you're going to get something that's a little bit bigger than zero. Okay. And so you get zero, you get four plus over zero plus. But in all reality, when it comes to a number that's a little bit bigger than four versus a number a little bit smaller than four, they're both going to be positive. So I can actually drop the plus on the four. I'm just going to write four over zero plus. So why is it so significant for the zero here? Well, the fact that we have this form of four over zero, we know that we have a vertical asymptote. So these left and right hand limits, they're going to be either plus or minus infinity. It's the sign that we're trying to figure out. We know it's infinite. We don't know the sign positive infinity or negative infinity. So keeping track of signs is imperative here. So on the other hand, if we look at this thing right here, if you have a positive four on the top and you divide by something a little bit bigger than zero, that is, it's positive. You take a positive divided by a very small positive. That's going to give you a very huge positive. Thus, this is going to translate to mean for us, we're going to get positive infinity. So drawing our picture back on the screen, we see that as we approach x equals two from the right, that our function is in fact going up towards positive infinity. On the other hand, if we take the left handed limit, so we're going to take x as it approaches two from the left of three x minus two over x minus two, then plug in two here for the numerator, we can get away with a two, right? You're going to get three times two minus two on the bottom.  Technically speaking, it would be four minus those were we're approaching four from the left. So we're getting numbers that are a little bit, little bit smaller than four. But in terms of a sign, again, we want something that's positive. If you're just a teeny bit smaller than four, you're going to be positive. So that symbol is not necessary. But in the denominator, which went to zero, it's significant. If we take a number that's a little bit smaller than two and subtract from a two, we're going to get something that's a little bit smaller than zero. In particular, it's going to be a negative number. So if you take a positive four and divide it by a negative number, which has a really, really, really small absolute value, the number will have huge absolute value, but it'll be negative. And hence, this gives us negative infinity. So we see here that as you approach two from the left, you'll get negative infinity. As you approach two from the right, you're going to get positive infinity. And so the left limit will be positive infinity, excuse me, the left limit will be negative infinity. The right limit will be positive infinity. So to answer the original question about what happens to the limit as x approaches two of three x minus two over x minus two, we see that this limit does not exist because the left limit is negative infinity. The right limit is positive infinity. There's disagreement there. Let's try this again a little bit faster this time now that we've seen the technique. If we plug in x equals two, you're going to see the denominator. This is going to look like, well, in the numerator, you're going to get four again, excuse me, three times two, which is six minus two is four.  So that's the form here. So again, we know there's a vertical asymptote at x equals two, but we need to learn more about it by looking at the left and the right hand limits. If we take the limit as x approaches two from the right, three x minus two over x minus two squared, we see that the top will be a four. Two, two plus minus two is going to be zero plus again. That's just like before you square it. So zero plus means we're approaching zero from the positive side. We're taking numbers that are very, very small, but still positive. So things just a little bit bigger than zero. Well, if you take something that's positive and you square, you're going to still get something that's positive. So you're going to get four over zero plus, which we interpret that as positive infinity. On the other hand, though, if we take the limit as x approaches two from the left of three x minus two over x minus two squared, we end up with four over zero minus like we did in the previous exercise. But zero minus means we're approaching zero from the left hand side from the negative side. If you take negative numbers and you square them, those are always positive. So zero minus squared is actually zero plus. And so this gives us positive infinity. So what this tells us about the graph is that our function here, the approach from the right is going towards infinity. The approach from the left is also going towards positive infinity. Therefore, the limit as x approaches two of three x minus two over x minus two squared, this will be positive infinity. All right, let's look at a final example of such a thing like this. You'll notice that I did switch up the numerator a little bit, we still have an x minus two on the bottom. So when you plug in x equals two, the bottom is going to look like a zero cube, which is equal to zero, of course. In the numerator, it's a little bit more complicated. You're going to have a negative, let's see, you're going to get a 12 minus a 14 plus a two. That's actually zero, right? You get zero over zero. That does not necessarily mean a vertical asymptote. It gives you an indeterminate form. It turns out anything could be happening at zero over zero. I mean, it's going to simplify the fraction. Really, what we are discovering here is that the numerator is divisible by x minus two. The denominator is obviously divisible by x minus two, because it's already factored, x minus two cubed, but we need to factor the numerator. So after some effort, you can discover that the numerator factors as three minus one, three x minus one times x minus two. Like so, for which then if you cancel the x minus two with one of the x minus two is on the bottom, you'll get a square there. We end up with the limit as x approaches two of negative three x minus one over x minus two squared, for which if we plug in our approach to two, we're going to get negative three times two minus one over, I'm going to put two to the plus minus minus two squared right here, because we have to pay attention. Are we approaching from the left or the right of two, because that gives us zero. Now in the numerator, you get three times two, which is six minus one, which is five, you're going to get a negative five on top. On the bottom, you're going to get zero plus or minus squared. But like we saw in the previous example, if you square positive, you get positive, you square negative, you get negative. And so in either case, you're going to get negative five over zero plus. So look at the signs there, the numerator is going to be negative as we get close to negative two, and the positive two, excuse me, and then the denominator is going to be positive as we get close to two. And so therefore this tells us that the limit is equal to negative infinity.


What'd you get there? Talk to me, talk to me, talk to me. So I can tell you those stories... I'm the tangent guy. I'm just kidding. No, no, no, I love tangents.  Everything... Well, not the weather or the heat. Thankfully, it was pretty good. Oh my God. I was out walking the dog at eight. You walked the dog at eight o'clock today? Seven, seven, three. You know what I have? That was gorgeous. I have a cat that I've taught to do dog tricks. Walking a leash, shake my hand, roll over. I can show you videos afterwards if you're really interested. But it's so cool to come home and the cat's like, can we walk? Nah, it's like fine, I'm a cat. I don't care. And then if it is nice, we can go out and walk. So like, I get all the benefits. There's somebody in our neighborhood who walks his dog on a leash and the cat just follows them. Oh, nice. Yeah. Okay, that works. So it is nice, except he doesn't pick up the dog food. I don't appreciate that. Ten thousand percent.  I'm like, what are you doing in this world? Anyway, there's enough oxygen for everybody except for you. I shouldn't even say that on there. My intake? Would you mind if I recorded it? Okay. So what I do is I normally set up this table and go out to parks and ask if anyone wants to have a conversation about whatever they want. A lot of times I get religious people and we'll talk about, they'll try to sell me on it or explain why they came into it. And we'll talk about the foundation of why they believe it. And then when we come back to the main topic where we rise up from that foundation, we find that they're a lot less confident in their position compared to where we started from. And through just a nice little five minute chat, we can have a good transition of critical thinking skills and stuff like that. I've never had the opportunity to do this with atheists. I'm an atheist myself. And that's what I'm thinking. Let me come over here and let's see if I can get some, how to put it, interviews with atheists, find out what they're coming from, that what people think is for Washington to understand and what the other people think. If you can interview the atheists, I'm sure you can interview the atheists. I have a horror story. Should I not have said that? No, because I tried doing it. There's a local meetup group where I'm at that has a bunch of atheists and I tried it there and they kicked me out. Really? Yeah, because they thought he's asking because there are very absolutes in that a God did not exist. And I'm like, the only thing I try to talk about is you should never really be absolute about anything, zero percent, one percent. That's like a really dangerous place to be because you stop asking questions. You kind of close your mind open. I don't know if a God exists. I'm waiting for evidence to convince me, but I'm not closing myself off from good evidence. I'm just, I think it's more reasonable to say, I don't got the evidence yet, that's why I don't believe and I'm waiting for better evidence. What do you think about that? Maybe you could talk about my perspective. Well, here's the way I look at it. Okay. I don't believe in unicorns. Right? You probably heard this church theme before. And I don't believe in unicorns not because I know positively that they don't exist because maybe somewhere there's a unicorn. Maybe somewhere there's a unicorn. But I'm going to not believe in them because there's no evidence for that. That's where I'm at. So I feel comfortable Right. saying I don't believe that there's unicorns. Right. That's where I'm at as well. Well, no, you're saying you you don't feel comfortable saying that there's no unicorns. You feel comfortable saying that there could be unicorns. Yeah. Like I'm in the same boat as like there could be a unicorn. Right. I haven't found evidence for that so I don't believe in that unicorn. Right. But there could be and I'm waiting for someone to come to me with good evidence. That's where I'm at. Yeah. I just don't feel uncomfortable saying I don't believe in things that I don't believe in. Right. Sure. There's no evidence. Yeah. Exactly. I also feel like a lot of people are not comfortable with the phrase I don't know with regards to does this exist or does it not exist. The people, I think the the main contention I reached with the other atheists over there was my position was between I know it and I don't know it or I'm sorry between I know it exists and I know it doesn't exist there's a third option which is I don't know if it exists or doesn't exist. Again, I'm waiting for better evidence and they're like, no it's so obvious that it doesn't exist. I'm like, how did you determine that? What's the method that you guys use? Is there anything that you feel comfortable saying for sure that it doesn't exist? To 100% certainty? Yeah. No. I at least I'm open to it but I need to have a macular amount of evidence to come to that. For me, an absolute claim is so the other thing that I find interesting about the first tree I don't need any more evidence. So if I said there's a giant dinosaur right over there but you just can't see it? Right. I am like 99.99% confident that that doesn't exist. Yeah, that's where I'm at. But when I say I'm 100% I don't even need any more evidence. I'm not asking more questions about it. I don't care what you say anymore. Even if there was a giant right there that was happening on its own I still won't believe it. I've closed myself off to that and I don't think that's a good position to be in. If I want to demonstrate that I'm a reasonable free thinker in a sense. I'm about how do I put it? It's tomato tomato I think. Is it? I think people are calling the same thing different things? Yeah. Different words for the same things. Yeah. I think some people like you said don't know what I don't know. Right. Ladies and gentlemen please welcome Kelly Helton. I feel like there's maybe even another point on that scale. My name's Kelly Helton and I'm the Equal Rights Advocate from the Chinese State Free Community. So damn sure it doesn't exist. Right. I feel comfortable saying that. Yeah, like my deal is I'm comfortable enough saying that I am very confident that the Christian God doesn't exist or that a law doesn't exist. I don't have the evidence because I don't have a method to demonstrate the supernatural to come to confirmation that a hundred percent confident that the Christian God doesn't exist because I don't understand of a way that I can test that. It's reliable enough for me to justify that level of certainty. That's where I'm coming from.  I've had teachers who shame students for not saving up the Pledge of Allegiance. I've had teachers who've made my fire-classing religious gospel songs in class this year. There's a lot of things that I'm very skeptical about. Sure, same here. Yeah. So, the supernatural in general I am not comfortable saying I don't believe in it. How confident are you that it doesn't exist? Ninety-eight percent. That's pretty good. Yeah. That's probably even more than I am. Yeah. I'm probably even more confident that it doesn't exist. But that's a bigger sure concept. I mean it includes a God. Sure. But it's not restricted to a God. Okay. I think we're on the same level here. Oh, I think so too. Let me throw something out then. Okay. Just right in front. As an atheist, what's the thing that you are most certain about? It doesn't matter that when I die, yeah, I'm dead. Sure. Dead and gone. Yeah. One child left in this world to carry on. It's pretty final. I know. Isn't that poetic? Yeah, it is. I did not make it up myself. I said, I do think that I do think that how to put it, the fact that life is temporary gives life value. And so, like when I look at, like, flowers and stuff like that, if I was going to have an eternity with those things, I feel like who cares? I can start paying attention to those things 500 years from now. But the fact that it's not going to be out here forever, I won't be.  Where'd you get there? Talk to me. Talk to me. I'm the tangent guy. I'm just kidding.  Well, they know they're going to live forever. Yeah. Yeah. They do get nasty, don't they? They're very nasty. They're very true. You can't trust them. Theoretically. Well, I mean, yeah, you never know.  Right? But I, and conversely, you know, a lot of things about religion give people permission to be gay. Because all they have to do is ask for forgiveness, right? Right. Right. Right. It's a good ticket to get out of a lot of situations. And if I offend you, And you can do it over and over and over again.  I can just pray to my God and I'm good to go. You know? But yeah, I think actually, tomorrow is my birthday. Okay. Okay. I'm gonna be 68. Okay. And I'm having a bit of an existential crisis right now. And we're doing it because um, been kind of down in the dumps for quite a while. Okay. And I think it's, you know, it's that reckoning with the fact that I'm not getting any younger. I have things left that I want to do. But the main thing that's making me do it is not the thought that I'm going to die someday, it's the thought that physically right now I am not able to do the things that I'm going to do. So, um, that part of it, you know, yet again, there's, you know, like they say, the hopes and prayers or, you know, thoughts and prayers don't help you anyway, so. Sure, sure, sure, sure. But yeah, it doesn't make me believe in God or want to believe in God or believe in life after death or any of those things, and maybe that's why it's more of a, oops, more of a, more of a thing for me, you know. Can I throw something out again? Yeah. And this might just be. Not physically though, please. I'm in bad shape. There's something beautiful in the fact that you're disappointed in the things that you can't do because if you weren't and you're the kind of person like, all these things I wanted to do, I can't do them, who cares? You're already dead inside, but the fact that you feel like the remorse that like, man, I'm so motivated, I want to get these things done, but I'm physically unable to do X, Y, Z. I'll have to come up with some other things that I can do. I'm still driven, I still want to do it and I feel bad for the things that are still living and still have goals. I can make goals and change goals. You're not alive, you're not sad. Exactly. I heard some people say heartbreak is love. That's the saving grace of having a finite lifetime.  But if you didn't care, who cared? Then it's like, you're already dead. There's all kinds of good things and all kinds of bad things that happen to all of us. And we can still live in the future and we don't need a God and we're like, dude, I was basically like, that's good for me. What is that? Thank you, Kat. Thank you so much. Thank you for lending me your umbrella, which keeps falling over. It does? Should I tie it and get down here? No, it's the whole chair stuff. Oh, no. I was wondering it's like, is it working? Yeah. Cool.


Make sure that you don't touch your roommate's stuff unless, you know, you speak about it and they say they're okay with it. Don't eat any of their food or drink any of their drinks unless you get their permission first. Usually you'll do a roommate agreement so you'll know where you stand, but when you first get in there, just make sure not to touch what's not yours. If you're dorming with your roommate, definitely don't randomly, you know, turn the lights on when they're sleeping and vice versa. Don't, you know, study for an exam or do a really disrespectful to your roommate and also prohibit them from getting their studying done. So if you're having an issue with your roommate, you should always go to your RA and fill them in about it. See if you can get advice from them or if they can help you do a different roommate agreement. They can usually be helpful in these situations. It's not a habit for you yet. Please make sure to clean up after yourself as soon as you use any dishes. It just saves you a lot of time in the long term and it also ensures that your roommate or the person you're living with, you know, they follow the same. Just best practice to do the same with your trash. Don't wait for your roommate if it's his or her designated date who take the trash out. Just do it yourself and if they're lagging behind constantly, you know, use your best discretion and let them know or have a word with them. But always, always make sure to clean up after yourself immediately. Just make it a habit. Noise is definitely something you really want to be respectful of with your roommate. You don't want to create too much noise when they're busy doing their schoolwork or they could be taking a test online. You never know. So I'm going to talk to you guys about bathroom etiquette. First off, make sure to flush. Some people forget but just a general rule of thumb. Also make sure that you're picking up after yourself in the bathroom that you take turns cleaning the sink, the toilet and the bathtub and just keep it clean.


Boy have we got a treat for you today. I'm Tammy, the cameraman is Chris and this is Collard Valley Cooks where we cook like our momma's did. Today we are making homemade tall feet. Some of it has pecans and chocolate and the other half has roasted almonds and chocolate. We're going to get started and I'm going to show you how easy it is to make this candy. Okay we're going to start by buttering your jelly roll pan 15 by 10. So you're going to butter it so your candy don't stick to it when we get our candy in here. I wasn't going to use my fingers but since I got these grooves in here I'm going to have to to get it in every little crack. Okay now the recipe calls for all almonds but I don't have two cups of almonds so I'm going to use half almonds and half pecans okay and it wants you to toast your almonds and mine are already toasted so that's easy. So I didn't have to do that step but the first step is preparing your chocolate and nuts and getting them in this pan right here. So what we're going to do is use our pool chopper and we're going to put our almonds in here the ones that I do have and chop them.  That way you're just left with the bigger pieces to go in your candy and I'll show you how little these are and why you wouldn't want them in your candy it would make it less pretty when you do break it up and put it on a serving sheet. You can tell by looking in there that you're like powder almost and now you're left with just nice big pieces of almond and we're just going to spread these on the sheet this looks like it might be kind of powdery we're going to make sure it's not. That's what's great about watching me do something instead of just looking at a recipe is you get more tips and things. I just happened to have some pecan pieces from a company that I like their pecans it's called the Stone Mountain Pecan Company out of Monroe Georgia and I do like their pecans I've talked to you all about people's pecans and some of them I like some of them I don't so these are already perfectly sized for toffee should do it and now for the chocolate you're going to use chocolate morsels I'm using milk chocolate I don't I didn't want to do dark chocolate on my toffee but if you like dark chocolate and I'm not going to do a whole lot of it either pull chop is not doing very good on this and it might be because the house is so cold and this chocolate is really cold so I'm going to put them in a bag and and beat them up with a mallet I think that'll work better for what I'm trying to accomplish here just get most of the air out of it all right I'll do it they're still in pretty big hunts but that's all right it's going to melt we're just going to sprinkle them on there either some horror pieces of chocolate you can use the tiny mini morsels if you like the dark chocolate but I don't think you can ever find those in milk chocolate so it is what it is what it be all right for the toffee you're going to use two sticks of butter I'm using a non-stick pot I'm using my green bean pot and you're going to bring it to a pretty slow boil and you're going to put in your butter two sticks and I'm using salted butter because everything sweet is better with a little salt on it make sure that's not a piece of it one make sure it didn't get paper in there so we're going to let this butter melt as soon as it melts we're going to add some sugar and two tablespoons of water it's really easy to make y'all stupid shoes slide my feet all right our butter is about melted so we're going to add a cup of sugar and three tablespoons of cold water three and I'm just going to put barely a little bit more because I couldn't get them completely full now you want to use a extra fine sugar when you make candy and that way the sugar can melt better all right and so I'm just going to stir it a little bit go around the edge with my little spatula to make sure I don't have sugar on the edge of the pot and then we're going to cover it I like to cover candy to make sure all that sugar gets down in there and melts so we're going to cover it and let it start boiling and then once it starts a really hard boil like a lot of bubbles then it should take about three minutes to get hard enough to make toffee all right so you're going to boil this until it gets to a soft crack stage which means it is going to spin a thread and really about the only way I'm going to be able to tail is just by holding this you can put this on the bottom because you can tell the needle it's got a metal thing that keeps the needle from sitting directly on the bottom it's almost a soft ball I'm going to turn the heat down a little bit and it's starting to caramelize a little bit and turn color and that's what peanut brutal always does all right we are at the firm ball stage so it's not going to be long until we get to the soft crack stage okay so let me just say this I want you guys to let us know about your toffee and what kind of toppings you like on yours okay and you know toffee is brown it's turning brown some so don't ever pour it up until it starts to turn and that's kind of the way peanut brutal does as well a lot of peanut brutal you buy is not good and colored it's light in color and I I like it darker in color I think it tastes better all right we're getting there all right I got a taller spatula because it's getting so hot it hurts my it's getting my hands too warm let me stir it good it's really about ready I'm gonna sit it right here because it's non-stick it'll be easy to clean we're going to get over here and pour it over our nuts and chocolate now be careful and do not spread it unless you've got a utensil to spread it with I'm going to start on the almond side I'm not sure they say this is enough for the whole pan but to me my recipe tells us to use it over the whole pan but it sure does seem like a big pan to me I guess it's supposed to be thin look how easy that cleans up that's the perfect now we're making a second batch because I think it needs more on the pan and I just did a second batch so it'd be easy it's better to have too much than not have enough so whenever you make this go ahead and mark in your cookbooks this is in the third cookbook cookbook volume three and mark it and just double everything I mean the almonds and the milk chocolate is fine but double your toffee recipe so you'll be using four sticks of butter two cups of sugar and six tablespoons of cold water and there's really no need in checking the temperature with a thermometer until it starts to turn brown like horrible okay then you can start checking your temperature and once it gets to that soft crack hurry and get it off the stove and in the pan all right you don't want to overcook it it's liable to separate the candy's liable to separate but you can tell right now it's not even close to being ready because it's not even turning brown yet if you want to of course you don't even have to put toppings on your toffee you can just let it be pieces of candy or you can beat it up really small and use it in cookies um or over the tops of cookies when you bake them and it's really good they even sell toffee bit pieces at the store so um you can turn it into toffee bits if you want to you noticed I pulled it off of the heat just to see where I'm at before I continue cooking it okay here we go that gets it if uh if you try to spread it and it does like it did the first time I tried to spread it because there wasn't enough on here um you know don't tear it all the pieces trying to spread it it don't matter you could even pick up the pan like this and let it run if you want to tell you but I think it's perfect just like that so we're going to let this cool down and then we're going to um crack it up and get us a bite all right we're going to take some parchment and get our candy out on top of it and really it would have been good to line this piece of parchment then I could have just lifted it right out looks good come out of the pan good so I must have did a pretty good job butter in it boy it looks pretty don't it so let's break it up it looks so good y'all the chocolate looks good the chocolate is like in the middle of the toffee it's like right in the middle looks really delicious so I think making two batches was smart all right you got your pecan side you got your almond side I'm going to try the almond side that is so dreamy I don't know what else to say it's dreamy dreamy delicious whoo boy it's hard to beat that I can guarantee one thing you can't buy something that tastes this good wow wow wow is that delicious I mean so good I'm gonna let Chris taste it y'all I've got to try this recipe it's super easy and boy will everybody love it this would be great to give as gifts as well that's so good we got too much of this we gotta get rid of it I'm gonna be eating it all day long it's gonna be good for football isn't it it's a good football treat this is some delicious stuff it's a must-try recipe don't be intimidated because it's candy it'll be good just cook it till it's about this color if you don't have a thermometer and pour it up all right just make sure it's nice and dark like this before you do all right I will see you next time on color belly cooks for we're cooking up good old-fashioned candy just like our momma's dad love ya bye when you have people come over for the holidays they want a good piece of candy and let me tell you this is good old-fashioned butter toffee recipe that can't be baked let's get started