Gather your ingredients.
In a heavy-bottomed saucepan, melt 3 tablespoons of the butter over medium-low heat.
Stir in ⅓ cup all-purpose flour to form a roux. Cook for 2 to 3 minutes, stirring frequently, until most of the water has cooked out (it will bubble less), which also allows the raw flour taste to cook off.
Slowly add 2 ½ cups of the warm milk while whisking or stirring constantly so that the liquid is incorporated into the roux without forming lumps.
Stick 2 to 3 whole cloves into ¼ medium onion (peeled) and add to the sauce along with 1 bay leaf . Simmer for about 10 minutes, or until it's reduced by about 20 percent.
Remove the bay leaf and the onion and strain the sauce through a fine-mesh strainer or a colander lined with cheesecloth. Make sure you retrieve all of the cloves.
Return the sauce to the pan. Add 2 ounces grated Gruyère and 2 ounces grated Parmesan cheeses and stir until the cheese has melted.
Remove from heat, stir in the remaining 1 tablespoon butter , and adjust the consistency with some or all of the remaining ½ cup milk if necessary. Serve right away with pasta, chicken, or fish. Enjoy!
